2011-12-13 19 views
5

私は、ソケットプログラミングはかなり新しくなっています。また、私が求めているコードは数年間働いていて、私が議論している問題は、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()メソッドの動作と異なる可能性があります。どんな助けもありがとう!

答えて

4

仕様によれば、これは予想される動作です。

http://msdn.microsoft.com/en-us/library/system.net.sockets.iocontrolcode(v=vs.110).aspxは、ReceiveAllがWinsock 2のSIO_RCVALL定数と等しいことを示します。

http://msdn.microsoft.com/en-us/library/windows/desktop/ee309610(v=vs.85).aspxは言う:Windows Server 2008およびそれ以前のオン

を、SIO_RCVALL IOCTL設定が ネットワークインターフェイスから送信されたローカルパケットをキャプチャしません。この には、別のインターフェイスで受信したパケットが含まれ、SIO_RCVALL IOCTLに指定されたネットワークインターフェイス が転送されました。

Windows 7の とWindows Server 2008 R2では、ローカルパケット がネットワークインターフェイスから送信されるように変更されました。これには、別のインターフェイスで受信した パケットが含まれ、次にSIO_RCVALL IOCTLを使用してソケットにバインドされた ネットワークインターフェイスが転送されます。

+0

ありがとうございました。私もその記事を見てきました。同じコンピュータで送受信しているときの動作がなぜわかりますかしかし、私はまだ別のコンピュータから送信するときに受信側のコンピュータでこの動作を観察します。おそらく、XPとWin7がブロードキャストを255.255.255.255にどのように処理するかと関係がありますか?また、私の生のソケットは、Windowsサービスで収集しているし、フロントエンドアプリケーションにデータを送信するIPCのための127.0.0.1を使用しています。おそらくそれもそれをキャッチしていますか? – bporter

+0

申し訳ありませんが、慎重にあなたの質問を読んでいない、私はそれを削除する必要がありますと思います。だからいくつかの新しい考え:どのアドレスにソケットをバインドしていますか?何らかの種類のIPブリッジまたはルーティングがアクティブになっていますか? IPCについて127.0.0.1に話すとき、IPパケットをフロントエンドに転送するだけではありませんか? –

+0

私は答えを削除しません。非常に有用な情報を提供しています。他のエンジニアの一人と一緒に、これらの質問に対する決定的な回答を得る必要があります。私は答えを知っていると思うが、私は確かに言うほどこのプロジェクトにはいない。 – bporter

関連する問題