0

C#.NETソケットベースのアプリケーションの送信側で次のコードを実行しています。

const int port = 1110;
System.Net.Sockets.UdpClient udp = null;

udp = new System.Net.Sockets.UdpClient(host, port);
...
byte[] data = m.Serialize();
udp.Send(data, data.Length);

そして、私はこのコードを受信側で実行しています:

System.Net.IPEndPoint replyAddress = new System.Net.IPEndPoint(
    System.Net.IPAddress.Any, port);
while ((udp != null) && (udp.Available > 0))
{
   ...
}

UDPポート1110の受信側の(Windows 7)ファイアウォールに例外を追加しました。ただし、ファイアウォールを完全に無効にしない限り、受信側のコードがwhileループに入ることはありません。ポート1110の例外が有効にならないのはなぜですか?Microsoft Network Monitorを使用すると、ポート1110に着信しようとしているメッセージを次のような説明で確認できますUDP:SrcPort = 1082, DstPort = 1110, Length = 11(ネットワークモニターは、ファイアウォールを通過してローカルシステム宛てのメッセージだけでなく、ローカルネットワーク上のすべてのメッセージを確認できると思います)。ファイアウォールを完全に無効にしない限り、アプリケーションはファイアウォールを受信しません。

ここで何が起こっているのかを理解したり、修正したりするにはどうすればよいですか?ループ内にブレークポイントを設定し、反対側にデータを送信させることができます。ファイアウォールを無効にした瞬間にブレークポイントに到達したため、トラフィックが通過できることはわかっていますが、ファイアウォールに関する何かがそれを妨げています。私のファイアウォールの例外は次のようになります。

全般的

  • 有効:True
  • 処置:接続を許可してください

プログラムとサービス

  • 指定された条件を満たしたすべてのプログラム
  • すべてのプログラムとサービスに適用する

コンピューター

  • (チェックを外して空)これらのコンピューターからの接続のみを許可する
  • (チェックされていない&空)これらのコンピューターからの接続については、このルールをスキップしてください

プロトコルとポート

  • プロトコルタイプ:UDP
  • プロトコル番号:17
  • ローカルポート:特定のポート
  • ポート:1110
  • リモートポート:すべてのポート

範囲

  • ローカルIPアドレス:任意のIPアドレス
  • リモートIPアドレス:任意のIPアドレス

高度

  • このルールが適用されるプロファイルを指定します:ドメイン、プライベート、パブリック(すべてチェック済み)
  • エッジトラバーサル:エッジトラバーサルを許可する

ユーザー

  • 許可されたユーザー:(チェックされていない&空)これらのユーザーからの接続のみを許可する
  • 例外:(チェックされていない&空)これらのユーザーからの接続については、このルールをスキップしてください
4

1 に答える 1

1

ファイアウォールルールをさらに検索した後、パスに基づいて受信プログラムを明示的にブロックする別のルールがあることを発見しました。Windowsがネットワークアクセスを必要とするプログラムについてのメッセージをポップアップするとき、私はあなたがどのように応答するかについて注意しなければならないと思います。一時的にアクセスを禁止したり、操作をキャンセルしたりするつもりでした(当時はまだプログラムを実行するつもりはありませんでした)。しかし、私の応答が得られると、Windowsはそのプログラムによるすべてのアクセスを永久にブロックするルールを追加しました。これらのルールを削除すると、UDP通信が期待どおりにファイアウォールを通過できるようになりました。

于 2012-12-16T21:49:01.123 に答える