2015-01-15 1 views
2

Windows 7에서 Winsock 클래스 CAsyncSocket을 사용하여 UDP 채팅 프로그램을 만듭니다. 연결되지 않은 UDP 소켓을 열고 채팅 프로그램을 실행하는 다른 컴퓨터로 텍스트 문자열을 보낼 수 있습니다. 내 채팅 프로그램이 이더넷 NIC가 크로스 오버 케이블로 연결된 두 대의 컴퓨터에서 실행될 때 (다른 네트워크 트래픽이 없음) 첫 번째 데이터 그램을 전송하려고 시도 할 때마다 다른 컴퓨터에서 첫 번째 데이터 그램을 전송할 때까지 실패합니다. 다음 화면 캡처에서 Computer # 1은 Computer # 2에 의해 수신되지 않고 "test"를 세 번 보내려고합니다. 컴퓨터 # 2는 # 1에서받은 "hello"를 보냅니다. 그런 다음 컴퓨터 # 1이 "테스트"를 다시 보내고 이번에는 수신됩니다. # 1에서 "test"의 세 가지 초기 전송은 통과하지 못했지만 # 2에서 "hello"가 # 1에서 "test"메시지 전에 전송되면 "hello"메시지가 분실되었다.첫 번째 데이터 그램을 수신 할 때까지 UDP 연결되지 않은 소켓 전송이 실패합니다.

컴퓨터 # 1

Station 1

컴퓨터 # 2

Station 2

후 각 컴퓨터에 성공적으로 다음 데이터 그램을 보낼 이후의 모든 데이터 그램이없이 전송 및 수신이 문제. [로컬 포트 ​​재설정] 소켓을 닫았다가 다시 열면 각 컴퓨터가 여전히 성공적으로 보내고받을 수 있습니다. [Reset Local Port] 두 컴퓨터가 대부분의 경우에 처음으로 동일한 문제를 경험하지만 동일한 문제는 아니지만 항상 발생합니다. 경우에 따라 [Reset Local Port] 송신 및 수신 중일 때도 여전히 작동합니다. 연결되지 않은 소켓을 작성하는 호출

Create(i_LocalPort, SOCK_DGRAM, FD_READ, m_LocalSockAddrIn.AddrStr()); 

그리고

CAsyncSocket::SendTo() 

는 데이터 그램을 보낼 수 있습니다. 여기에 무슨 일이 일어나고 있는지에 대한 힌트를 찾고 있습니다.

업데이트 정보 : 손실 된 패킷은 Wireshark로 보아도 적절한 소스 및 대상 주소와 함께 전송 된 것처럼 보이지만 대상에서 수신되지 않습니다. Datagram Capture

+0

NIC가 DHCP를 사용하도록 구성되어 있습니까? 그렇다면 크로스 오버 케이블은 네트워크에서 가능한 모든 DHCP 서버를 제거하므로 IP 주소가 없으므로 설명이됩니다. 테스트 할 현실적인 상황이 아닙니다. – EJP

+0

크로스 오버와 고정 IP 주소를 사용하여 네트워크 스위치가 데이터 그램이나 UDP 트래픽을 유발하는 다른 네트워크 트래픽을 통과하지 못하게하는 등의 다른 변수를 제거하려고했습니다. DHCP를 사용하여 로컬 LAN에 있었고 처음에는이 동일한 문제를 보았습니다. – JonN

+0

이 문제를 해결하기 위해 계속 노력하고 있습니다.나는 다른 UDP Chat 프로그램으로 테스트를 해본 결과이 프로그램들과 함께 데이터 그램을 수신하지 못하는 것을 발견했다. 나는 지금 네트워크 환경을 의심하고있다. 나는 사용을 시도했다 http://udp-win-chat.software.informer.com/download/ 그리고 교차 송수신기에서 고립 된 네트워크를 가지고 을 송수신하는 경우가 있었다. WireShark 나는 보내진 데이터 그램을 보았다. 양측 모두 udpchat 프로그램은 아무것도받지 못한 것으로 나타납니다. – JonN

답변

1

이 문제는 Windows 방화벽으로 인해 발생했습니다. 문제가 없어지는 두 컴퓨터에서 방화벽을 해제했습니다. 일반적으로 Windows는 액세스를 차단했지만 컴퓨터 중 하나가 비활성화되었을 때 대화 상자를 표시합니다. "Windows 방화벽이 새 프로그램을 차단할 때 알림" 대화 메시지가 없었습니다. 그냥 자동으로 데이터 그램을 버렸습니다. 메시지가 전송 된 후 Datagrams가 허용하는 이유는 프로그램이 보낸 포트로부터의 수신을 허용한다는 예외가 있기 때문입니다. 그래서 다른 항구로 보내고 나서 그것으로부터받는 것이 가능했습니다.

+0

질문을 읽은 후에 Windows 방화벽을 사용하지 않도록 설정하고 50 포인트 현상금을 받으라고 제안했습니다. Drat. ;) Windows 방화벽은 기본적으로 인바운드 연결을 허용하지 않습니다. UDP는 상태 저장 프로토콜이 아니므로 나가는 패킷이 걸리므로 나가는 연결을 설정 한 것입니다. – Zenexer

관련 문제