私は、ソケットプログラミングはかなり新しくなっています。また、私が求めているコードは数年間働いていて、私が議論している問題は、Windows XPをWindows 7に変更したときから始まったばかりです。ソケットを使用してWindows7ではUDPブロードキャストを受信するのにXPでは重複しないパケットが表示されるのはなぜですか?
ネットワークパケットを送受信するC#アプリケーション。これはネットワークスニファ型アプリケーションのようなものなので、データの整合性は非常に重要です。 Windows XPからWindows 7に移行して以来、私たちはUDPブロードキャスト(255.255.255.255)パケットを受信すると、パケットを2回受信します。 (つまり、610パケットを送信すると、1220パケットが受信されます)。
私はWireSharkでパケットが1回だけ受信されていることを確認しました。また、.NETコードで置き換えられた古いC++ソケットコードもあります。古いC++コードは重複を示していません。これらは両方とも、610パケットが送信され、610パケットが受信されたことを示す。
コードは、高度にスレッド化し、さまざまなクラス間のスプリットが、一緒に作品の一部を入れて、受信コードは次のようになりますされています読み取るための責任のコードで
public class RawSocket : Socket
{
public RawSocket(IPAddress address, int receiveBufferSize, bool receiveAll)
: base(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP)
{
Bind(new IPEndPoint(address, 0));
ReceiveBufferSize = receiveBufferSize;
ReceiveTimeout = 500; // half-a-second
if (receiveAll) {
byte[] incoming = BitConverter.GetBytes(1);
byte[] outgoing = BitConverter.GetBytes(1);
IOControl(IOControlCode.ReceiveAll, incoming, outgoing);
}
}
}
_device = new RawSocket(/* IP Address Specified Here */);
そして...
byte[] buffer = new byte[ 65536 ];
int read = _device.Receive(buffer);
if (read > 0)
{
_packet = new byte[ size ];
_packet.BlockCopy(buffer, offset, size);
}
私の質問は、Windows XPとWindows 7の間で.NETソケットAPIを使用した場合に何が変わったのですか?私は違いがあることを示すスレッドを読んでいますが、このようなものはありません。コードをたどると、Socket
クラスのReceive()
メソッドの動作と異なる可能性があります。どんな助けもありがとう!
ありがとうございました。私もその記事を見てきました。同じコンピュータで送受信しているときの動作がなぜわかりますかしかし、私はまだ別のコンピュータから送信するときに受信側のコンピュータでこの動作を観察します。おそらく、XPとWin7がブロードキャストを255.255.255.255にどのように処理するかと関係がありますか?また、私の生のソケットは、Windowsサービスで収集しているし、フロントエンドアプリケーションにデータを送信するIPCのための127.0.0.1を使用しています。おそらくそれもそれをキャッチしていますか? – bporter
申し訳ありませんが、慎重にあなたの質問を読んでいない、私はそれを削除する必要がありますと思います。だからいくつかの新しい考え:どのアドレスにソケットをバインドしていますか?何らかの種類のIPブリッジまたはルーティングがアクティブになっていますか? IPCについて127.0.0.1に話すとき、IPパケットをフロントエンドに転送するだけではありませんか? –
私は答えを削除しません。非常に有用な情報を提供しています。他のエンジニアの一人と一緒に、これらの質問に対する決定的な回答を得る必要があります。私は答えを知っていると思うが、私は確かに言うほどこのプロジェクトにはいない。 – bporter