は、私は窓7 64ビットを実行しているよ、私が本当に知りたいのは何の.NET Framework 3.5ソケットが閉じられたときにUDP .netソケットがバインドされたポートを解放する方法はありますか?この質問のために
は
- でバインドされているポートを解放/アンバインドする方法はあります?
- socketoption再利用アドレスを設定すると、ポートにバインドできますが、そのアドレス/ポートを使用してデータを受信することはありませんか?
私が使用してバインドされているポートで探していますnetstatの-apd UDP
私が使用しているテストコードは、通常、私は1つのパケットを受信した後にポートを閉じないと、以下の通りです。
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が私に表示されるので、ソケットを閉じるとポートはまだバインドされています。再バインドしようとすると、再使用アドレスソケットオプションが設定されていない限り、使用例外が発生します。それは理にかなっている。再使用アドレスソケットオプションが設定されている場合は、ポートを閉じて開いたりバインドした後にパケットを受信することはありません。 – SeanV
UDPがコネクションレスプロトコルであることが正しいので、接続を取り除くための質問を編集しました。私が本当に知りたいのは、1)バインドされているポートをバインド解除/解放する方法があるかどうかです。 2)ソケットオプションの再利用アドレスを設定すると、ポートにバインドできますが、そのアドレス/ポートを使ってデータを受信することはありません。 – SeanV