TCP/IP --> UDP



  • Hallo ich habe hier einen TCP/IP Listener und möchte diesen nun in einen UDP Listener umwandeln.

    Wenn ich im Code "SOCK_STREAM" in "SOCK_DGRAM" (Z.30) änder bekomme ich eine Fehlermeldung, kann mir da jemand weiterhelfen?

    #include <windows.h>
    #include <winsock.h>
    #include <stdio.h>
    
    //Prototypen
    int startWinsock(void);
    
    int main()
    {
      long rc;
      SOCKET acceptSocket;
      SOCKET connectedSocket;
      SOCKADDR_IN addr;
      char buf[256];
      char buf2[300];
    
      // Winsock starten
      rc=startWinsock();
      if(rc!=0)
      {
        printf("Fehler: startWinsock, fehler code: %d\n",rc);
        return 1;
      }
      else
      {
        printf("Winsock gestartet!\n");
      }
    
      // Socket erstellen
      acceptSocket=socket(AF_INET,SOCK_STREAM,0);
      if(acceptSocket==INVALID_SOCKET)
      {
        printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Socket erstellt!\n");
      }
    
      // Socket binden
      memset(&addr,0,sizeof(SOCKADDR_IN));
      addr.sin_family=AF_INET;
      addr.sin_port=htons(12345);
      addr.sin_addr.s_addr=INADDR_ANY;
      rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
      if(rc==SOCKET_ERROR)
      {
        printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Socket an port 12345 gebunden\n");
      }
    
      // In den listen Modus
      rc=listen(acceptSocket,10);
      if(rc==SOCKET_ERROR)
      {
        printf("Fehler: listen, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("acceptSocket ist im listen Modus....\n");
      }
    
      // Verbindung annehmen
      connectedSocket=accept(acceptSocket,NULL,NULL);
      if(connectedSocket==INVALID_SOCKET)
      {
        printf("Fehler: accept, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Neue Verbindung wurde akzeptiert!\n");
      }
    
      // Daten austauschen
      while(rc!=SOCKET_ERROR)
      {
        rc=recv(connectedSocket,buf,256,0);
        if(rc==0)
        {
          printf("Server hat die Verbindung getrennt..\n");
          break;
        }
        if(rc==SOCKET_ERROR)
        {
          printf("Fehler: recv, fehler code: %d\n",WSAGetLastError());
          break;
        }
        buf[rc]='\0';
        printf("Client sendet: %s\n",buf);
        sprintf(buf2,"Du mich auch %s",buf);
        rc=send(connectedSocket,buf2,strlen(buf2),0);
      }
      closesocket(acceptSocket);
      closesocket(connectedSocket);
      WSACleanup();
      return 0;
    }
    

    Gruß,
    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.



  • Weil UDP ein bisschen anders funktioniert 🙄



  • .... schrieb:

    Weil UDP ein bisschen anders funktioniert 🙄

    So weit bin ich auch schon 😉 und wie?

    PS: Ich weis schon, dass UDP Verbindungslos ist und also einige Teile des oben stehenden Programmes entfernt werden müssen, ich habe diese Teile nur zum besseren Verständnis des Programmes dringelassen.



  • Biest du dumm? Lies es doch im Internet nach.



  • .... schrieb:

    Biest du dumm? Lies es doch im Internet nach.

    Ich glaub mal nicht das ich dumm "bien" und wenn ich eine Lösung auf mein Problem im Internet (oder auch im Forum) gefunden hätte, hätte ich wohl kaum die Frage gestellt, oder?



  • f.sp schrieb:

    Wenn ich im Code "SOCK_STREAM" in "SOCK_DGRAM" (Z.30) änder bekomme ich eine Fehlermeldung, kann mir da jemand weiterhelfen?

    welche fehlermeldung und wo im code taucht die auf?
    btw: ich glaub' nicht, dass 'accept' und 'listen' für UDP irgendwas bewirken 😉



  • So also hier gibts nen Tutorial:
    http://www.c-worker.ch/tuts.php

    Dies solltest du dir durchlesen, weil UDP wirklich ganz anders funktioniert als TCP.
    Wichtigster Unterschied: TCP ist verbindungsorientiert, das heißt es muss zuerst eine Verbindungs hergestellt werden. UDP braucht "keine" Verbindung.

    MFG
    Ace



  • AceKiller73 schrieb:

    So also hier gibts nen Tutorial:
    http://www.c-worker.ch/tuts.php

    Das Tutorial kenne ich, aber ich bekomme es einfach nicht zum laufen...

    ich bekomme immer die Fehlermeldung: "recvfrom, fehler code: 10054" das senden funktioniert aber.

    hier das Programm:

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

    Gruß,
    Freddy



  • Das ist ja nur der Quellcode deines Clienten oder??

    Weil du kannst ja nicht etwas im gleichen Programm senden und empfangen(also jedenfalls nicht so wie dus amchst)

    recvfrom wird ja erst später ausgeführt als sendto.

    Wenn du was empfangen willst musst du noch einen server coden, oder dieses ganze recvfrom in einen eigene thread reinpacken(weiß aber net ob da so gut ist)

    MFG
    Ace



  • Das ist das Beispiel von dem Tutorial (http://www.c-worker.ch/tuts.php)

    Ich brauche nur den Client aber wenn ich den "sendto" befehl herausnehme funktioniert es garnichtmehr. Und jetzt funktioniert das empfangen (das was ich eigentlich brauche) nicht...


Anmelden zum Antworten