getsockopt() и CSADDR_INFO на С#

117
09 января 2020, 19:40

Пытаюсь использовать getsockopt() c параметром SO_BSP_STATE, используя

    [DllImport("Ws2_32.dll")]
    public static extern int getsockopt(IntPtr s, int level, int optname,
        ref CSADDR_INFO buf, ref int optlen);

так как ожидаю получить указатель на структуру CSADDR_INFO.

    [StructLayout(LayoutKind.Sequential)]
    public struct SOCKADDR
    {
        public ushort sa_family;         
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 14)]
        public char[] sa_data;             
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct SOCKET_ADDRESS
    {
        IntPtr lpSockaddr;  //SOCKADDR
        int iSockaddrLength;
    }
    [StructLayout(LayoutKind.Sequential)]
    public struct CSADDR_INFO
    {
        public SOCKET_ADDRESS LocalAddr;
        public SOCKET_ADDRESS RemoteAddr;
        public int iSocketType;
        public int iProtocol;
    }

Делаю это следующим образом:

CSADDR_INFO cSADDR_INFO = new CSADDR_INFO();
int optLen = Marshal.SizeOf(cSADDR_INFO);
int res=0;
res = getsockopt(s, SOL_SOCKET, SO_BSP_STATE, ref cSADDR_INFO, ref optLen);

В итоге res всегда -1, а WSAGetLastError() выдает

WSAEFAULT 10014 Bad address.

Подскажите пожалуйста, в чем может быть проблема. Если использовать char[], byte[] или IntPtr за место ref CSADDR_INFO, перед этим выделив места заведомо больше размера структуры или по размеру, выходит тоже самое. С другими параметрами, вроде SO_CONNECT_TIME, работает замечательно.

READ ALSO
sqlite-net-pcl C# как получить данные из определенного столбца из базы данных?

sqlite-net-pcl C# как получить данные из определенного столбца из базы данных?

у меня есть локальная база данных создал на основе этой статьи https://docsmicrosoft

147
EF Core. Skip & Take (Include)

EF Core. Skip & Take (Include)

Всем приветЕсть модель MainCategory, содержащая коллекцию Categories

120
Как получить значения Width и Height используя Auto

Как получить значения Width и Height используя Auto

Попытался найти похожее, не понял всё равно как

170