c# WSAStartup 初始化 Winsock 模块

256 阅读1分钟
  1. 系统

windows

  1. c++ 实现
int iError;
WSADATA WSAData;
if (0 != (iError = WSAStartup (MAKEWORD(2,0), &WSAData)))
{
//此处添加出错处理。。。
}
  1. c# p/invok
        public static bool InitSocket2()
        {        
            WSADATA wsaData = new WSADATA();
            int r = WSAStartup(0x0202, ref wsaData);
            return r == 0;
        }

        [DllImport("ws2_32.dll")]
        public static extern Int32 WSAStartup(UInt16 wVer, ref WSADATA wsaData);

        public struct WSADATA //这样声明结构体
        {
            public short wVersion;
            public short wHighVersion;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
            public string szDescription;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)]
            public string szSystemStatus;
            [Obsolete]
            public int wMaxSockets;
            [Obsolete]
            public int wMAXUDPDG;
            public IntPtr dwVendorInfo;
        }

参考:

C#调用C++ DLL WSAStartup怎么转_百度知道 (baidu.com)

  1. Vanara.​PInvoke.​Ws2_32

nuget 地址

NuGet Gallery | Vanara.PInvoke.Ws2_32 3.4.16

 public sealed class WinSocket2
    {
        private static Vanara.PInvoke.Ws2_32.WSADATA wsaData;

        public static bool InitSocket2()
        {
            var ret = Vanara.PInvoke.Ws2_32.WSAStartup(2, out wsaData);
            if (ret == Win32Error.ERROR_SUCCESS)
                return true;
            else
                return false;
        }
    }

遇到的问题:

  • NET Core + 项目时,正常使用

  • .Net Framewokr 4.5.2 时,出现异常

“Vanara.PInvoke.Ws2_32”的类型初始值设定项引发异常。

image.png