2016-07-07 25 views
0

Ich habe ein Problem, weil mein Server UDP-Daten nicht erhalten. Ports auf dem Router werden weitergeleitet, Dateneinkommen zu lokalen Server-Netzwerk (es ist auf Sniffer (3) sichtbar), aber Server nicht erhalten.C++ WINSOCK recvfrom keine Daten aus dem Netzwerk

Server and server network screen

Sie können TCP 1 und 2 Pakete korrekt Einkommen Server auf angeschlossenen Steckdosen sehen. Aber mein Client sendet dann UDP-Daten an den Server und die Daten gehen an das lokale Server-Netzwerk (siehe, dass der Sniffer es auf 3 erkennt), aber der Server nimmt es nicht.

Hier ist der Code von Client:

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); 
} 

Aber es ist nicht Problem mit Client. Hier ist der Code-Server, aber ich denke, es ist auch richtig:

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); 

einer Beschreibung, die helfen können - Hauptserver Schleife wählen ist() und wenn der Client für die Auftrags fragen, Server, um zurück an den Client senden und startet Befehl fortfahren.

Bitte geben Sie mir keine Answears, es in einer anderen Wartezeit zu tun. Ich muss Loch für NAT Traversal ausstanzen. Welches Problem ist das? Ein anderer Zuhörer greift nach meinen Daten? Aber Netstat -nop UDP -a gab keine Informationen, dass etwas anderes zuhört, und Bind-Socket ist nicht fehlgeschlagen. Auch eine andere wichtige Information Dieser Code am Anfang des Programms arbeiten, ich meine Server empfangen Daten aber später nicht.

+0

Sind Sie sicher, dass Sie den UDP-Server-Socket vor dem Senden der Daten eingerichtet haben? Es ist nicht klar in deiner Frage. – ElderBug

+0

* Warnung * Ihre Variable 'Nachricht' ist möglicherweise nicht gut initialisiert: 'memcpy (Nachricht," cokolwiek ", 8);', überprüfen Sie den Wert von 'strlen()' – purplepsycho

+0

@ElderBug ja, das war das Problem, danke Kamerad. Aber warum kamen Daten nicht zum Recvbuffer? – colorgreen

Antwort

1

Okey, so wie ElderBug sagte

Sind Sie sicher, dass Sie Setup der UDP Server-Socket, bevor Sie die Daten senden? Es ist nicht klar in Ihrer Frage

Ja, es war meine Schuld. Die Minisekunden entschieden, dass das Senden von Daten auf einem Rechner ausgeführt wurde, bevor der Listener auf dem Server eingerichtet wurde. Danke für die Antwort.

Aber ich verstehe nicht genau das Problem. Sollte nicht dieses Dateneinkommen Puffer erhalten und darauf warten, es durch recvfrom Funktion "zu packen"?

+0

Bevor Sie den Socket einrichten, empfängt das Betriebssystem das Paket, aber es gibt keinen zugeordneten Socket für den Port, daher wird das Paket einfach verworfen. Es macht mehr Sinn, wenn Sie es anders hinnehmen: Es wäre seltsam, teurer (und potenziell schädlich), jedes beliebige Paket unabhängig von den Hörsockeln zu speichern. – ElderBug

+0

Ja, das stimmt! Danke für die Erklärung! – colorgreen