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 Problem 😞

    Ich habe übrigens die Anleitung von hier benutzt: http://www.c-worker.ch/tuts/udp.php#diff

    Liebe Grüße
    Hahro





  • 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.


Log in to reply