UDP Beispiel funktioniert nicht



  • Hallo,
    ich habe das UDP Beispiel von http://www.c-worker.ch/tuts.php

    Das senden funktioniert aber dann bekomme ich die Fehlermeldung "recvfrom, fehler code: 10054"

    Eigentlich benötige ich aber nur das empfangen.

    #include <windows.h>
    #include <winsock.h>
    #include <stdio.h>
    #include <conio.h>
    
    //Prototypen
    
    int startWinsock(void);
    
    int main()
    {
      long rc;
      SOCKET s;
      char buf[256];
      SOCKADDR_IN addr;
      SOCKADDR_IN remoteAddr;
      int         remoteAddrLen=sizeof(SOCKADDR_IN);
      rc=startWinsock();
    
      if(rc!=0)
      {
        printf("Fehler: startWinsock, fehler code: %d\n",rc);
        getch();
        return 1;
      }
      else
      {
        printf("Winsock gestartet!\n");
      }  //UDP Socket erstellen
    
      s=socket(AF_INET,SOCK_DGRAM,0);
    
      if(s==INVALID_SOCKET)
      {
        printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
        getch();
        return 1;
      }
      else
      {
        printf("UDP Socket erstellt!\n");
      }  // addr vorbereiten
    
      addr.sin_family=AF_INET;
      addr.sin_port=htons(5999);
      addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    
      while(true)
      {
        printf("Text eingeben: ");
        gets(buf);
        rc=sendto (s,buf,strlen(buf),0,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    
        if(rc==SOCKET_ERROR)
        {
          printf("Fehler: sendto, fehler code: %d\n",WSAGetLastError());
          return 1;
        }
        else
        {
          printf("%d Bytes gesendet!\n", rc);
        }
    
        rc=recvfrom(s,buf,256,0,(SOCKADDR*)&remoteAddr,&remoteAddrLen);
        if(rc==SOCKET_ERROR)
        {
           printf("Fehler: recvfrom, fehler code: %d\n",WSAGetLastError());
           getch();
           return 1;
        }
        else
        {
          printf("%d Bytes empfangen!\n", rc);
          buf[rc]='\0';
          printf("Empfangene Daten: %s\n",buf);
        }
      }
    }
    
    int startWinsock(void)
    {
       WSADATA wsa;
       return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    

    Die Ausgabe sieht z.B. so aus:

    Winsock gestartet!
    UDP Socket erstellt!
    Text eingeben: test
    4 Bytes gesendet!
    Fehler: recvfrom, fehler code: 10054
    

    Ich habe schon alles mögliche probiert, aber nichts hat geholfen und das Programm muss noch diese Woche funktionieren 😕

    Weis jemand woran das liegen könnte?

    Viele Grüße,
    Freddy



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • f.sp schrieb:

    Weis jemand woran das liegen könnte?

    der andere hat keinen offenen udp-port auf dem er deine datagrams empfangen kann, deshalb sendet er dir eine ICMP message: 'port unreachable'
    also:
    - sende nichts
    oder
    - sende broadcasts
    oder
    - mach bei der gegenstelle einen port auf.
    🙂



  • Was meinst du mit "der andere"?

    ich möchte mit diesem Programm eigentlich nur empfangen, aber ich kann den Sendebefehl nicht entfernen...



  • f.sp schrieb:

    Was meinst du mit "der andere"?

    das andere UDP, an das dein programm sendet.

    f.sp schrieb:

    ...aber ich kann den Sendebefehl nicht entfernen...

    warum nicht? 😕



  • pale dog schrieb:

    das andere UDP, an das dein programm sendet.

    das gibt es eigentlich nicht, da das Programm ja nur empfangen soll 😉

    pale dog schrieb:

    f.sp schrieb:

    ...aber ich kann den Sendebefehl nicht entfernen...

    warum nicht? 😕

    Dann bekomme ich die Fehlermeldung: "recvfrom, fehler code: 10022"





  • ich meinte damit das dein code funktioniert wenn du den server startest 😉



  • f.sp schrieb:

    Dann bekomme ich die Fehlermeldung: "recvfrom, fehler code: 10022"

    da fehlt dann noch der 'bind' aufruf, der sagt dem socket, auf welchem port er lauschen soll.



  • pale dog schrieb:

    da fehlt dann noch der 'bind' aufruf, der sagt dem socket, auf welchem port er lauschen soll.

    wie ist denn die Syntax des "bind" Aufrufes?



  • ich habe jetzt

    rc=bind(s,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
      if(rc==SOCKET_ERROR)
      {
        printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());
        getchar();
        return 1;
      }
      else
      {
        printf("Socket an port 5999 gebunden\n");
      }
    

    eingefügt, bekomme jetzt aber den Fehler: "bind, fehler code: 10048"



  • f.sp schrieb:

    "bind, fehler code: 10048"

    das heisst 'address in use' :p
    es bedeutet, dass irgendein programm auf deinem rechner die selbe UDP port/ip-nummernkombination schon geöffnet hat.

    wie ist die SOCKADDR initialisiert?
    wenn mit AF_INET und INADDR_ANY, dann solltest du mal die portnummer variieren...



  • Danke 🙂 ein java Programm ist noch im Hintergrund gelaufen... 😉

    Bei einem Testprogramm tut es jetzt, aber bei einem Anderen bekomme ich den Fehler: "recvfrom 10040" was bedeutet das? Wie kann man eigentlich herausfinden was die codes bedeuten?



  • in der console: net helpmsg fehlernummer



  • f.sp schrieb:

    Wie kann man eigentlich herausfinden was die codes bedeuten?

    --> http://msdn2.microsoft.com/en-us/library/ms740668.aspx
    🙂



  • Der Puffer war zu klein, jetzt funktioniert es!!! 🙂

    Vielen Dank für die tolle Hilfe!!!! 😃


Anmelden zum Antworten