Probleme mit UDP WinSocket (C++)
-
Hallo zusammen,
ich arbeite derzeit an einem Programm, das einen einfachen Datenstring über UDP versenden und auch wieder empfangen soll.Das andere Programm (das in C# geschrieben ist) empfängt den String meines Programms, der Verbindungsaufbau funktioniert also.
Es sendet daraufhin einen String zurück, dieser kommt auch an (habe dies mit Wireshark überprüft).
Mein C++ Programm empfängt diesen aber nicht und ich bekomme durchgehend einen 10060: TimeOut Fehler beim recv
Selbst direkt nach dem senden kann ich nichts empfangen und wenigstens dann sollte der Port ja noch offen sein
Es klappt weder mit recfrom, noch mit recv.
Selbst lokal gelingt dies nicht.Hat schon jemand Erfahrung mit UDP Sockets gemacht?
Ich vermute, dass der Fehler irgendwo in diesem Part liegt.
(Connect wird vorher ausgeführt)static int timeout = 100; setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)); while (1) { printf("Text eingeben: "); gets(buf); rc = sendto(s, buf, strlen(buf), 0, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)); //rc = send(s, buf, strlen(buf), 0); if (rc == SOCKET_ERROR) { //printf("Fehler: sendto, fehler code: %d\n",WSAGetLastError()); printf("Fehler: send, fehler code: %d\n", WSAGetLastError()); //return 1; } else { printf("%d Bytes gesendet!\n", rc); } static int timeout = 100; setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)); int wait = 0; while (wait == 0) { rc = recvfrom(s, buf, 256, 0, (SOCKADDR*)&addr, &remoteAddrLen); //rc = recv(s, buf, 256, 0); if (rc == SOCKET_ERROR) { //printf("Fehler: recvfrom, fehler code: %d\n",WSAGetLastError()); printf("Fehler: recv, fehler code: %d\n", WSAGetLastError()); //return 1; } else { wait = 1; printf("%d Bytes empfangen!\n", rc); buf[rc] = '\0'; printf("Empfangene Daten: %s\n", buf); } } }
Wäre echt toll, wenn jemand eine Idee hätte.
Ich habe mir schon mehrere Lösungwege angeguckt, aber keiner ändert etwas an meinem ProblemIch habe übrigens die Anleitung von hier benutzt: http://www.c-worker.ch/tuts/udp.php#diff
Liebe Grüße
Hahro
-
Schau ob damit weiter kommst:
http://www.codeproject.com/Articles/11740/A-simple-UDP-time-server-and-client-for-beginners
http://www.c-worker.ch/tuts/udp.php
-
mit "select" die Wartezeit von "recvfrom" definieren
könnte so aussehen
boolean iNet_SocketTimeoutRead(SOCKET sock, int millisekunden){ struct timeval tv; fd_set fd_read; int err; tv.tv_sec = 0; tv.tv_usec = millisekunden*1000; FD_ZERO(&fd_read); fd_read.fd_count = 1; fd_read.fd_array[0] = sock; FD_SET(sock, &fd_read); err = select(0, &fd_read, NULL, NULL, &tv); if(err <= 0){ return FALSE; } return TRUE; }
dann wo bei dir das steht
while (wait == 0) { rc = recvfrom(s, buf, 256, 0, (SOCKADDR*)&addr, &remoteAddrLen); //rc = recv(s, buf, 256, 0);
das da einsetzen
while(iNet_SocketTimeoutRead(s, 250) == TRUE) { rc = recvfrom(s, buf, 256, 0, (SOCKADDR*)&addr, &remoteAddrLen); //rc = recv(s, buf, 256, 0);
-
Grübel, grübel....
Nun, wenn ich Deine Absicht richtig verstehe, willst Du in ein und demselben Programm (und auf denselben Socket) etwas senden und kurze Zeit später empfangen?
Überleg mal, warum das gar nicht gehen kann.