RAWソケットを使用する必要がある(私のような)人のために、ここに回避策があります。
ゴール:
- 任意のポートにRAWUDPソケットを作成するには
- システムが選択したポートを確認します。
期待される:(IPEndPointとしてのsocket.LocalEndPoint).Port
問題
- 一方、DGRAM UDPソケットは、その(socket.LocalEndPoint as IPEndPoint).Portを認識しています。
- RAWUDPソケットは常にゼロを返します
解決:
- 通常のDGRAMUDPソケットを作成します
- そのソケットをバインドします
- その港を見つける
- その通常のソケットを閉じます
- RAWUDPソケットを作成します
警告:
- ソケットは常にゼロを報告するため、変更された
local
IPEndPoint変数を使用してポートを確認します。
コード:
public Socket CreateBoundRawUdpSocket(ref IPEndPoint local)
{
if (0 == local.port)
{
Socket wasted = new Socket(local.AddressFamily,
SocketType.Dgram,
ProtocolType.Udp);
wasted.Bind(local);
local.Port = (wasted.LocalEndPoint as IPEndPoint).Port;
wasted.Close();
}
Socket goal = new Socket(local.AddressFamily,
SocketType.Raw,
ProtocolType.Udp);
goal.Bind(local);
return goal;
}