對於這個問題,我運行Windows 7 64位,.NET Framework 3.5的有沒有辦法讓UDP .net套接字在套接字關閉時釋放綁定端口?
我真正想知道的是
- 是否有辦法解除綁定/釋放已綁定端口?
- 當我設置了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是無連接協議。這個問題沒有意義。 – 2012-02-25 22:43:28
當netstat顯示我時關閉套接字時,端口仍然綁定。當我嘗試重新綁定時,除非我重用地址套接字選項集,否則我會進入使用異常狀態。這就說得通了。如果我重複使用地址套接字選項集,在關閉並打開/綁定端口後,我從不接收數據包。 – SeanV 2012-02-26 15:34:46
編輯該問題以擺脫連接,因爲UDP是無連接協議是正確的。我真正想知道的是1)是否有解綁定/釋放綁定端口的方法。 2)當我設置socketoption重用地址時,我能夠綁定到端口,但我從不接收使用該地址/端口的數據。 – SeanV 2012-02-26 15:40:30