2011-12-13 3 views
5

소켓 프로그래밍이 나에게 새롭다는 것을 알리십시오. 또한, 나는에 대해 부탁 해요 코드는 몇 년 동안 일했다, 우리가 윈도우 7에 내가 보내고 네트워크 패킷을 수신하는 C# 응용 프로그램 작업입니다소켓을 사용하여 Windows7에서 UDP 브로드 캐스트를 수신 할 때 중복 패킷이 표시되는 이유는 무엇입니까?

를 윈도우 XP를 지원 변경 때 논의 문제는 단지 시작 . 그것은 일종의 네트워크 스니퍼 타입 응용 프로그램이므로 데이터 무결성이 매우 중요합니다. Windows XP에서 Windows 7으로 마이그레이션 한 이후로 UDP 브로드 캐스트 (255.255.255.255) 패킷을 수신하면 두 번 패킷이 수신됩니다. (즉, 610 패킷을 보내면 1220 패킷을받습니다).

WireShark는 패킷이 한 번만 수신되었다고 확인했습니다. 또한 .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

관련 문제