C# Winforms UDPClient Exception: "Only one usage of each socket address is normally permitted."



我正在使用C#/Winforms的GUI,该GUI通过UDP与另一个系统通信。我正在为此使用dotnet" udpclient"类。我在每次传输中都使用一个插座,一个用于接收:

UdpClient client = new UdpClient(receiveport_num);
client.Client.SetSocketOption(SocketOptionLevel.Socket,     SocketOptionName.ReuseAddress, true);
client.Client.SetSocketOption(SocketOptionLevel.Socket,     SocketOptionName.ExclusiveAddressUse, false);
client.BeginReceive(DataReceived, client);
UdpClient server = new UdpClient(ConnectionSettings.soport);
server.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
server.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ExclusiveAddressUse, false);

然后从server.send.

从"服务器"套接字接收。

一旦我用插座完成或关闭了应用程序,就将其处理出来:

client.Client.Shutdown(SocketShutdown.Both);
client.Client.Close();
client.Close();
client = null;
server.Client.Shutdown(SocketShutdown.Both);
server.Client.Close();
server.Close();
server = null;

由于某种原因,如果我尝试重新创建这些插座,要么通过再次创建插座或重新启动应用程序,我会得到一个例外:

System: Only one usage of each socket address (protocol/network) is normally permitted.

我理解这是因为即使我关闭了插座,底层的窗口插座也在徘徊,因为窗户使它们保持活力...

我想每次都使用相同的端口号并重新创建插座。我怎样才能做到这一点?如果这是不可能的(如果您问我,这听起来像是Windows中的一个网络问题...)>

我发现了问题。我的应用程序是使用Process.Start(ProcessStartInfo pi)产卵过程。使用此功能时,属于主要申请过程(包括插座)的所有手柄均由孩子继承。

当父程流程死亡时,孩子仍然活跃,保持插座打开。这可以通过两种方式之一解决:

a)使用p/调用,将Process.Start替换为createprocess(),将bInheritHandles设置为false。据我所知,dotnet Process.Start函数没有等效的,我认为这是一个监督。

b)使用p/Invoke,在创建每个套接字后,您不希望子进程继承,将SetHandleInformation()INHERIT称为dwMask参数,而NONEdwFlags参数。

相关内容

最新更新