読者です 読者をやめる 読者になる 読者になる

SocketException の SocketErrorCode が AddressAlreadyInUse であれこれ

C# Socket
通常、各ソケット アドレスに対してプロトコル、ネットワーク アドレス、またはポートのどれか 1 つのみを使用できます。

っていうエラーがでて、この例外の SocketErrorCode プロパティ [microsoft.com] が SocketError.AddressAlreadyInUse だったんだよね。
このエラーは、1 つのコンピューターで同じアドレスとポートのペアを 2 つ以上のソケットで使うことができないってのを表してるんだよ*1
それで、同じアドレスとポートのペアを既に使用してるから、例外が投げられちゃったんだよね。

それでね、このエラーってソケットをちゃんと閉じてなかった時にもでることがあるんだよねw
特に、ソケット通信してから終了するメソッドを 2 回目に呼び出した時にね…。

    UdpClient client = new UdpClient( local_port, use_address_family );

    try {
        client.JoinMulticastGroup( group_address );

        //
        // TODO:
        // Send とか Receive とかを呼んだりする。
        //

        client.DropMulticastGroup( group_address );
    } catch {
    }

という感じのデータをマルチキャストで送信して終了するメソッドだったんだけど、終了する前に閉じるのを忘れた所為で
もう一回同じメソッドが呼び出された時、上記の例外が投げられちゃった。
どうやらソケットが未だ生きてたみたい。

幸い、UdpClient クラス [microsoft.com] も TcpClient クラス [microsoft.com] も IDisposable インターフェイス [microsoft.com] を実装しているみたいなので
using ブロックで囲んでおくといいかもね。

*1:そういうことだと思ってた