我正在使用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
参数,而NONE
为dwFlags
参数。