Web服务调用在3次成功调用后导致WSAStartUp错误

本文关键字:调用 WSAStartUp 错误 成功 服务 3次 Web | 更新日期: 2023-09-27 18:26:33

我有一个C#winforms应用程序,它通过.DLL.作为一些访问设备的服务器

用户访问是通过向网络服务发送输入(设置为网络参考)并将结果返回到设备来确定的,但在超时的情况下,应用程序会断开所有设备的连接,停止服务器,并启动后台工作程序。后台工作人员重试与Web服务的连接,如果成功,则再次启动服务器,并重新连接设备。

这一切都很好,但不幸的是,在第三次、第四次或第五次,后台工作人员试图重新连接到Web服务,连接失败,并出现异常"要么应用程序没有调用WSAStartup,要么WSAStartup失败"。接下来的每一次尝试,都会得到一个类似的错误。

以下是后台工作人员的来源,它的代码非常简单:

private void backgroundWorkerStopServer_DoWork(object sender, DoWorkEventArgs e)
    {
        System.Threading.Thread.Sleep(2000);
        stopServer();
        NewDoorCheck.Doorcheck ndoorcheck = new NewDoorCheck.Doorcheck();
        ndoorcheck.Timeout = 15000;
        bool disconnected = true;
        while (disconnected)
        {
            try
            {
                ndoorcheck.WebserviceIsUp();
                UpdateLog("Connected web");
                disconnected = false;
                startServer();
            }
            catch (Exception ex)
            {
                UpdateLog(ex.Message);
                UpdateLog(ex.StackTrace);
                UpdateLog("Still Down");
                System.Threading.Thread.Sleep(60000);
            }
        }

顺便说一句,在其他方面,网络服务就像一种魅力。

Web服务调用在3次成功调用后导致WSAStartUp错误

通过在异常处理程序中手动调用WSAstartup并重试,我最终解决了这个问题。

Winsock 的进口

class WSAinterop
{
    [StructLayout(LayoutKind.Sequential)]
    internal struct WSAData
    {
        public short wVersion;
        public short wHighVersion;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
        public string szDescription;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)]
        public string szSystemStatus;
        public short iMaxSockets;
        public short iMaxUdpDg;
        public int lpVendorInfo;
    }

    [DllImport("wsock32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
    internal static extern int WSAStartup(
          [In] short wVersionRequested,
          [Out] out WSAData lpWSAData
          );
    [DllImport("wsock32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
    internal static extern int WSACleanup();
    private const int IP_SUCCESS = 0;
    private const short VERSION = 2;
    public static bool SocketInitialize()
    {
        WSAData d;
        return WSAStartup(VERSION, out d) == IP_SUCCESS;
    }
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
}

只需使用SocketInitialize()方法。

bool startup = WSAinterop.SocketInitialize();