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);
}
}
顺便说一句,在其他方面,网络服务就像一种魅力。
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();