2012-02-25 5 views
2

は、私は窓7 64ビットを実行しているよ、私が本当に知りたいのは何の.NET Framework 3.5ソケットが閉じられたときにUDP .netソケットがバインドされたポートを解放する方法はありますか?この質問のために

  1. でバインドされているポートを解放/アンバインドする方法はあります?
  2. 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(); 
       } 

     }    

} 
+3

UDPはコネクションレスプロトコルです。この質問は意味をなさない。 –

+1

netstatが私に表示されるので、ソケットを閉じるとポートはまだバインドされています。再バインドしようとすると、再使用アドレスソケットオプションが設定されていない限り、使用例外が発生します。それは理にかなっている。再使用アドレスソケットオプションが設定されている場合は、ポートを閉じて開いたりバインドした後にパケットを受信することはありません。 – SeanV

+1

UDPがコネクションレスプロトコルであることが正しいので、接続を取り除くための質問を編集しました。私が本当に知りたいのは、1)バインドされているポートをバインド解除/解放する方法があるかどうかです。 2)ソケットオプションの再利用アドレスを設定すると、ポートにバインドできますが、そのアドレス/ポートを使ってデータを受信することはありません。 – SeanV

答えて

1

close()が呼び出されたときにポートが解放されなければならないので、close()が呼び出されていないか、それが成功していないいずれかのように聞こえます。

shutdown()コールはUDPにはあまり適用されませんので、削除してください。

close()のエラーリターンを確認して、呼び出されていることと成功していることを確認してください。

+1

答えをありがとう。 close()には戻り値の型がありません。 http://msdn.microsoft.com/en-us/library/wahsac9k%28v=vs.90%29.aspx – SeanV

+0

メソッドの場合、基になる 'closesocket()'関数がエラーを返した場合、例外がスローされるはずです。だから、実際にその声明に到達し、例外をキャッチしていることを確認してください。 –

+0

ありがとうございます。コードをステップバイステップで実行し、socket.close()を呼び出してヒットし、例外をスローせずに戻ります。 – SeanV

関連する問題