【发布时间】:2012-02-25 22:41:59
【问题描述】:
对于这个问题,我正在运行 windows 7 64 位,.net framework 3.5
我真正想知道的是
- 有没有办法解除绑定/释放已绑定的端口?
- 当我设置 socketoption 重用地址时,我能够绑定到端口,但我从未使用该地址/端口接收数据?
我正在查看使用 netstat -apd udp 绑定了哪些端口
我正在使用的测试代码如下,通常我不会在收到一个数据包后关闭端口。
EndPoint endpoint = new IPEndPoint(state.IPAddress, state.Port);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
socket.Bind(endpoint);
ReadStateObject stateObject = new ReadStateObject();
stateObject.socket = socket;
stateObject.Port = state.Port;
stateObject.IPAddress = state.IPAddress;
stateObject.BurstDataReceivedEvent = state.BurstDataReceivedEvent;
stateObject.shutdownRequested = state.StopRequestedEvent;
socket.BeginReceiveFrom(stateObject.buffer,
0,
stateObject.buffer.Length,
SocketFlags.None, // Was 0 which is likely the same enumeration but this is clearer
ref endpoint,
new AsyncCallback(BurstUdpListener.SocketBeginReceiveAsyncCallback),
stateObject);
// wait for read to complete... or the thread to be asked to stop
while (stateObject.readFinished.WaitOne(100, false) == false)
{
// has this thread been requested to stop? if so, cancel the pending read
if (state.StopRequestedEvent.WaitOne(1, false) == true)
{
stop = true;
break;
}
}
socket.Shutdown(SocketShutdown.Both);
socket.Close();
socket = null;
private static void SocketBeginReceiveAsyncCallback(IAsyncResult ar)
{
if (ar.IsCompleted)
{
ReadStateObject state = ar.AsyncState as ReadStateObject;
if (state != null)
{
if (state.shutdownRequested.WaitOne(1, false))
return;
EndPoint endpoint = new IPEndPoint(state.IPAddress, state.Port);
int bytesReceived = state.socket.EndReceiveFrom(ar, ref endpoint); // for some reason throws error here on changes to settings
if (state.BurstDataReceivedEvent != null)
{
state.BurstDataReceivedEvent(null, new BurstDataReceivedEventArgs(state.buffer, bytesReceived));
}
state.readFinished.Set();
}
}
}
【问题讨论】:
-
UDP 是一种无连接协议。这个问题没有意义。
-
当我像 netstat 显示的那样关闭套接字时,端口仍然被绑定。当我尝试重新绑定时,我将进入使用异常,除非我设置了重用地址套接字选项。那讲得通。如果我设置了重用地址套接字选项,则在关闭和打开/绑定到端口后,我永远不会收到数据包。
-
编辑了问题以摆脱连接,因为您认为 UDP 是无连接协议是正确的。我真正想知道的是 1) 有没有办法解除绑定/释放已绑定的端口。 2)当我设置 socketoption 重用地址时,我能够绑定到端口,但我从未使用该地址/端口接收数据。
标签: c# windows sockets windows-7 udp