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.
Sind Sie sicher, dass Sie den UDP-Server-Socket vor dem Senden der Daten eingerichtet haben? Es ist nicht klar in deiner Frage. – ElderBug
* Warnung * Ihre Variable 'Nachricht' ist möglicherweise nicht gut initialisiert: 'memcpy (Nachricht," cokolwiek ", 8);', überprüfen Sie den Wert von 'strlen()' – purplepsycho
@ElderBug ja, das war das Problem, danke Kamerad. Aber warum kamen Daten nicht zum Recvbuffer? – colorgreen