2016-07-07 4 views
0

내 서버가 UDP 데이터를받지 못하기 때문에 문제가 있습니다. 라우터의 포트는 로컬 서버 네트워크 (스니퍼 (3)에서 볼 수 있음)로 데이터를 전달하지만 서버는받지 못합니다.C++ WINSOCK recvfrom 네트워크에서 데이터 가져 오기

Server and server network screen

당신은 연결 소켓 서버 1 개 2 TCP 패킷 정확한 소득을 볼 수 있습니다. 하지만 내 클라이언트는 UDP 데이터를 서버에 보내고 데이터는 로컬 서버 네트워크에 입력합니다 (스니퍼가 3에서이를 감지합니다).하지만 서버는 가져 가지 않습니다.

struct sockaddr_in si_other; 
int s, slen = sizeof(si_other); 
char buf[10]; 
char message[10]; 
WSADATA wsa; 

//Initialise winsock 
printf("\nInitialising Winsock..."); 
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) 
{ 
    printf("Failed. Error Code : %d", WSAGetLastError()); 
    exit(EXIT_FAILURE); 
} 
printf("Initialised.\n"); 

//create socket 
if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR) 
{ 
    printf("socket() failed with error code : %d", WSAGetLastError()); 
    exit(EXIT_FAILURE); 
} 

//setup address structure 
memset((char *)&si_other, 0, sizeof(si_other)); 
si_other.sin_family = AF_INET; 
si_other.sin_port = htons(14996); 
si_other.sin_addr.S_un.S_addr = inet_addr(server ip); 

memcpy(message, "cokolwiek", 8); 

//send the message 
if (sendto(s, message, strlen(message), 0, (struct sockaddr *) &si_other, slen) == SOCKET_ERROR) 
{ 
    printf("sendto() failed with error code : %d", WSAGetLastError()); 
    exit(EXIT_FAILURE); 
} 

그러나 클라이언트와의하지 문제 : 다음

클라이언트의 코드입니다. 여기에 서버 코드입니다하지만 난 그것도 올바른 생각 :

SOCKET s; 
struct sockaddr_in server, si_other; 
int slen, recv_len; 
char buf[10]; 
WSADATA wsa; 

slen = sizeof(si_other); 

//Initialise winsock 
printf("\nInitialising Winsock..."); 
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) 
{ 
    printf("Failed. Error Code : %d", WSAGetLastError()); 
    exit(EXIT_FAILURE); 
} 
printf("Initialised.\n"); 

//Create a socket 
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) 
{ 
    printf("Could not create socket : %d", WSAGetLastError()); 
} 
printf("Socket created.\n"); 

//Prepare the sockaddr_in structure 
server.sin_family = AF_INET; 
server.sin_addr.s_addr = INADDR_ANY; 
server.sin_port = htons(14996); 

//Bind 
if (::bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR) 
{ 
    printf("Bind failed with error code : %d", WSAGetLastError()); 
    exit(EXIT_FAILURE); 
} 
puts("Bind done"); 

//blocking on it, waiting for data 
if ((recv_len = recvfrom(s, buf, 10, 0, (struct sockaddr *) &si_other, &slen)) == SOCKET_ERROR) 
{ 
    printf("recvfrom() failed with error code : %d", WSAGetLastError()); 
    exit(EXIT_FAILURE); 
} 

//print details of the client/peer and the data received 
printf("Received packet from %s:%d\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port)); 
printf("Data: %s\n", buf); 

도움이 될 몇 가지 설명 - 메인 서버 루프는 선택이다()와 클라이언트가 명령을 요청할 때, 서버 다시 클라이언트에 명령을 보내 명령을 진행하기 시작합니다.

server: 
while (1) { 
    select() 

     if (socket is in FD_SET) 
      get data, send it back and handleCommand() 
} 

handleCommand() { 
    tcp data exchange 
    wait for udp packet - it fail 
} 

client: 

sendCommand() 

//another receiving commands thread 
while (recv) { 
    handle command 
    tcp data exchange 
    send udp data 
} 

Pls는 다른 대기 시간에 응답하지 않습니다. NAT Traversal에 구멍을 내야합니다. 그게 무슨 문제 야? 내 데이터를 수집하는 또 다른 청취자가 있습니까? 그러나 netstat -nop UDP -a는 다른 사람이 듣고있는 정보를 제공하지 않았고 바인드 소켓이 실패하지 않았습니다. 또한 또 다른 중요한 정보 그 프로그램의 시작에 해당 코드 작업, 나는 서버하지만 나중에 수신 데이터를 의미합니다.

+0

데이터를 보내기 전에 UDP 서버 소켓을 설정 했습니까? 귀하의 질문에 명확하지 않습니다. – ElderBug

+0

* 경고 * 변수'message'는 잘 초기화되지 않았습니다 :'memcpy (message, "cokolwiek", 8);', strlen()에 의해 반환 된 값 확인 – purplepsycho

+0

@ElderBug 예, 문제였습니다. 항해사. 그러나 왜 데이터가 recvbuffer에 오지 않았습니까? – colorgreen

답변

1

좋아요는 ElderBug 수 있도록 당신이 설정을 사용하면 이전에 UDP 서버 소켓이 데이터를 보낼 확실

을했다? 귀하의 질문에 명확하지 않다

네, 그건 내 잘못이었습니다. miniseconds는 서버에 리스너를 설정하기 전에 하나의 시스템에서 데이터 전송이 실행되도록 결정했습니다. 답변 주셔서 감사합니다.

하지만 문제는 정확하게 이해하지 못합니다. 그 데이터 수입은 버퍼를 받고 recvfrom 함수로 "잡아"기다려야합니까?

+0

소켓을 설정하기 전에 OS는 패킷을 수신하지만 해당 포트에 연결된 소켓이 없으므로 패킷은 그냥 삭제됩니다. 그것은 당신이 그것을 다른 방향으로 가져 가면 더 이해가됩니다 : 듣기 소켓에 관계없이 모든 임의의 패킷을 저장하는 것은 이상하고, 더 비싸고 (잠재적으로 유해한) 것입니다. – ElderBug

+0

네, 맞습니다! 설명해 주셔서 감사합니다! – colorgreen

관련 문제