カテゴリー別アーカイブ: ソケット

ソースポートを固定するには

時間ないのでメモだけ。

int lPort = 60000;
localEP = (EndPoint)(new IPEndPoint(IPAddress.Any, lPort));
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
if (lPort != 0) clientSocket.Bind(localEP);

ソースポート(送信元ポート)は送信時にOSにランダムに割り当ててもらうのが普通だと思うけど、あるハードウェア通信をするときに固定する必要があった。

もし固定しないと、送信したソケットと別にサーバーソケットを用意しなければならなくて面倒なことになる。

Rubyではできたけど、C#についてはずいぶん探すのに苦労した。ソケットについてはあまりよく知らんので、経験則のみに頼ってる。

ローカルエンドポイントのポートを0で指定すると、ランダムソースポートになり、それ以外だと固定ソースポートになるということらしい。

上のソースではUDPの再送を実装したくて、System.Net.Sockets.UdpClientを使わなかった。UdpClientの場合はBindメソッドないので、多分コンストラクタでlocalEP渡せばよいと思う。