ぴーさんログ

だいたいXamarin.Formsのブログ

UdpClientでICMPのPort Unreachableメッセージを無視する方法

単一のUdpClientインスタンスで非同期に受信待ちしながらデータを送信する、簡易チャット中継サーバのようなシステムを作りました。 すると、閉じたポートにパケットを送信した際にUdpClientがICMPのPort Unreachableメッセージを受け取って例外を吐いてしまいます。

UDPなんだからパケットが届いたかどうかなんて気にせず投げっ放しにしたいなーと思って調べたところ、Stack Overflowにズバリ回答がありました。

asynchronous - C# Async UDP listener SocketException - Stack Overflow

UdpClient.Clientプロパティ(Socketクラス)のIOControlメソッドで設定すると例外が飛んで来なくなります。

public const int SIO_UDP_CONNRESET = -1744830452;

var client = new UdpClient(endpoint);
client.Client.IOControl(
    (IOControlCode)SIO_UDP_CONNRESET, 
    new byte[] { 0, 0, 0, 0 }, 
    null
);