c#-soket2 初始化

3 阅读1分钟

winsocket2 初始化封装

public sealed class WinSocket2
{
    private static bool _initialized = false;

    public static bool InitSocket2()
    {
        if (_initialized) return true;

        try
        {
            WSADATA wsaData;
            int result = WSAStartup(0x0202, out wsaData);
            if (result == 0)
            {
                _initialized = true;
                return true;
            }
            return false;
        }
        catch (Exception ex)
        {
            // 在实际应用中,这里应该记录日志
            Console.WriteLine($"WSAStartup failed: {ex.Message}");
            return false;
        }
    }

    public static void CleanupSocket2()
    {
        if (_initialized)
        {
            WSACleanup();
            _initialized = false;
        }
    }

    [DllImport("ws2_32.dll", CallingConvention = CallingConvention.Winapi)]
    public static extern int WSAStartup(ushort wVersionRequested, out WSADATA lpWSAData);

    [DllImport("ws2_32.dll", CallingConvention = CallingConvention.Winapi)]
    public static extern int WSACleanup();

    [StructLayout(LayoutKind.Sequential)]
    public struct WSADATA
    {
        public ushort wVersion;
        public ushort wHighVersion;

        // 注意:这两个字段在Winsock 2中已废弃,但为了兼容性需要保留
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
        public string szDescription;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)]
        public string szSystemStatus;

        public ushort iMaxSockets;    // 已废弃,但需要保留
        public ushort iMaxUdpDg;      // 已废弃,但需要保留
        public IntPtr lpVendorInfo;
    }
}