내 워크 스테이션 (192.168.0.1)과 내 WinCE6 장치 (192.168.0.100) 사이의 이더넷 인터페이스를 통해 UDP 소켓으로 작업하고 있습니다.C++ Winsock UDP sendto는 성공했지만 전송되는 데이터가 표시되지 않습니다.
내 워크 스테이션에서 수신 소켓을 설정하고 포트 9002에서 데이터를 올바르게 수신하는 WinCE 장치로 UDP 패킷을 보낼 수 있습니다. 그런 다음 장치는 데이터를 내 워크 스테이션에 적절하게 다시 에코합니다.
가 내 장치가 특정 포트에 내 워크 스테이션에 응답 할 : 내 장치에 실행하는 서버가
9001, 그것은 this과 동일하지만 난의 주소에 소켓 바인드 수정
#define BUFLEN 512 //Max length of buffer
#define PORT 9002 //The port on which to listen for incoming data
void test_udp(void)
{
SOCKET s;
struct sockaddr_in server, si_other;
int slen , recv_len;
char buf[BUFLEN];
WSADATA wsa;
slen = sizeof(si_other) ;
//Initialise winsock
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
return;
}
//Create a socket
if((s = socket(AF_INET , SOCK_DGRAM , 0)) == INVALID_SOCKET)
{
printf("Could not create socket : %d" , WSAGetLastError());
}
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(0xC0A80064);
server.sin_port = htons(PORT);
//Bind
if(bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
{
return;
}
//keep listening for data
while(1)
{
//clear the buffer by filling null, it might have previously received data
memset(buf,'\0', BUFLEN);
//try to receive some data, this is a blocking call
if ((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)) == SOCKET_ERROR)
{
return;
}
// *** CHANGE THE SEND PORT
si_other.sin_port = htons(9001);
//now reply the client with the same data
if (sendto(s, buf, recv_len, 0, (struct sockaddr*) &si_other, slen) == SOCKET_ERROR)
{
return;
}
}
closesocket(s);
WSACleanup();
return;
}
내가, 내가 수와 일치 sendto를위한 적절한 반환 값을 얻고 다시 포트 9001에 데이터를 보내려고하는 // *** CHANGE THE SEND PORT
주석 아래의 라인을 추가하는 경우 : 특정 인터페이스와 나는 PORT
정의 변경 내가 예상했던 바이트 수 엔트이지만 데이터가 내 워크 스테이션에 오는 것을 보지 못했습니다 (9001 듣기).
나는 이것에 대한 내 머리를 두드리고 있었는데 나는 틀린 것을 본다. 수정 된 예제에서 어떤 도움이라도 대단히 감사하겠습니다.
업데이트 : 개발 PC의 방화벽이 잘못되었습니다. 그것은 PC가 보내고 있던 동일한 포트에서 다시 트래픽을 허용했지만 다른 포트에서는 트래픽을 차단했습니다. 코드를 변경하지 않고 트래픽을 전송할 수있는 해결. 이전에 방화벽을 비활성화했지만 OS가 방화벽을 활성화 한 "공용 네트워크"로 이더넷을 지정했는지는 알지 못했습니다.
수신 프로그램이 작동하는지 어떻게 알 수 있습니까? wireshark를 사용하여 무엇이 전선에 부딪 치는 지 보셨습니까? 'sendto()'의 리턴 코드를 출력하면 실패했는지 그렇지 않은지를 알기가 어려울 것이기 때문에 또한 도움이 될 것입니다. –
첫 번째로해야 할 일은 bind를 검사하고 WSAGetLastError를 사용하는 것입니다. 어떤 페이스 체크에서 두 번째로 인쇄 할 때 : 예를 들어 메시지를 받았다면. 차단 기능을 사용하여 송수신하십시오. 가장 좋은 방법은 내가 udp 소켓과 멀티 쓰레딩을 사용하여 채팅 프로그램을 만들었습니다. – Raindrop7
왜 'sin_port'를 바꾸고 있습니까? 그것은'recvfrom()'다음에 송신 포트 번호를 이미 포함 할 것입니다. 그것이 당신이 대답하고 싶은 항구입니다. 해당 행을 제거하십시오. – EJP