Ganz einfacher Chat // Server-Client



  • Hallo
    ich suche eine möglichkeit
    ein ganz einfachen Chat zu schreiben, wenn sowas überhaupt "einfach" möglich ist
    ich hab schon gegoogelt aber were immer nur auf die winsock seite gelinkt, ich weis garnicht wie und wo ich da anfangen soll

    kann mir mal wer helfen ?



  • Die Grundlagen:
    http://beej.us/guide/bgnet/
    einfach die PDF runterladen
    (aber das thema ist komplexer als du denkst)

    wenn du die Grundkonzepte verstanden hast kannst du dir auch boost asio...
    http://www.highscore.de/cpp/boost/asio.html

    ...und boost serialization anschauen
    http://www.highscore.de/cpp/boost/serialisierung.html

    libevent könnte dich aber auch interessieren
    http://libevent.org/

    Lass dich nicht von den vielen Links abschrecken. Ein ganz einfacher Chat wird schon im ersten Tutorial, den ich dir gegeben hab, geschrieben, aber falls du mehr über Netzwerkprogrammierung lernen möchtest (ist eigentlich ganz interessant) solltest du dir auch den Rest anschauen.



  • Hab was gefunden !!!

    2 ausführbare Codes
    Client kann den Server ein Befehl abfragen!!! 😛

    Achtung! Die libws_2.a muss noch eingebunden werden !!!;)
    Achtung! Erst den Server öffnen, dann Client !

    Server:

    #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h>
    
    //Prototypen
    
    char Buch[] = { "Merlin" };
    
    int startWinsock(void);
    
    int main()
    {
      char Buchabfrage[6];
      long rc;
      SOCKET acceptSocket;
      SOCKET connectedSocket;
      SOCKADDR_IN addr;
      char buf[256];
      char buf2[300];
      // Winsock starten
      rc=startWinsock();
      // Socket erstellen
      acceptSocket=socket(AF_INET,SOCK_STREAM,0);
    
      // Socket binden
      memset(&addr,0,sizeof(SOCKADDR_IN));
      addr.sin_family=AF_INET;
      addr.sin_port=htons(12345);
      addr.sin_addr.s_addr=ADDR_ANY;
      rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
    
      // In den listen Modus
      rc=listen(acceptSocket,10);
    
      // Verbindung annehmen
      connectedSocket=accept(acceptSocket,NULL,NULL);
    
      // Daten austauschen
      while(rc!=SOCKET_ERROR)
      {
        rc=recv(connectedSocket,buf,256,0);
        buf[rc]='\0';
        printf("Gesendeter Befehl: %s\n",buf);
        //sprintf(buf2,"Du mich auch %s",buf);
        rc=send(connectedSocket,buf2,strlen(buf2),0);
    
        //scanf( "%s",&Buch); // test
    
        if((strcmp(Buch, buf)) == 0)
        {
        Sleep(1000);
        system("cls");
    
        Sleep(1000);
        printf(".");                 
    
        Sleep(1000);
        printf(".");                 
    
        Sleep(1000);
        printf(".");                 
    
        printf("Befehl wird ausgeführt\n");
        }
        else
        {
        printf("unbekannter Befehl\n");
        }
      }
      closesocket(acceptSocket);
      closesocket(connectedSocket);
      WSACleanup();
      Sleep(1000);
      return 0;
    }
    
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    

    Client:

    #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h>
    
    //Prototypen
    int startWinsock(void);
    
    int main()
    {
      long rc;
      SOCKET s;
      SOCKADDR_IN addr;
      char buf[256];
    
      // Winsock starten
      rc=startWinsock();
    
      // Socket erstellen
      s=socket(AF_INET,SOCK_STREAM,0);
    
      // Verbinden
      memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
      addr.sin_family=AF_INET;
      addr.sin_port=htons(12345); // wir verwenden mal port 12345
      addr.sin_addr.s_addr=inet_addr("127.0.0.1"); // zielrechner ist unser eigener
    
      rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    
      // Daten austauschen
      while(rc!=SOCKET_ERROR)
      {
        printf("\nBefehl: [max 256]: ");
        gets(buf);
        send(s,buf,strlen(buf),0);
        rc=recv(s,buf,256,0);
        buf[rc]='\0';
        printf("\nServer antwortet: %s\n",buf);
      }
      closesocket(s);
      WSACleanup();
      Sleep(6000);
      return 0;
    }
    
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    

    Ursprungsquelle:

    http://www.c-worker.ch/
    http://www.c-programmieren.com/C-Lernen.html

    🕶 Have Fun ...
    PS: gibt mal "Merlin" in Client ein... 😉

    und unter wichtig Speichern 😛



  • die abfrage hab ich geschrieben mithilfe von c-programmieren
    OKEY es it zwar C aber egal es funtz 🤡



  • und alle fehlerabfragen sind auch erstmal gelöscht worden damit man mal versteht was dort überhaupt passirt



  • ACHJA wir haben es gerade in Hamachi getestet 😃

    ES KLAPT !!!! mein kollege sitzt 20km entfehrnt

    Hamachi Netzwerkerstellen
    dein freund muss beitreten
    DANN IN C:

    Server:
    port: 5stellige zahl erfinden
    ip: nimmt die von hamachi

    client an dein freund schicken



  • port: 5stellige zahl erfinden

    Das stimmt so nicht. Portnummern können nicht höher als 65535 sein.

    The Registered Ports are in the range 1024-65535.

    Siehe http://www.freesoft.org/CIE/RFC/1700/4.htm .



  • hä ich check garnicht mehr was jetzt server und was client ist
    kann es sein das er sich vertan hat ?
    und das obere client ist und das untere server ?



  • Server

    printf("\nBefehl: ");
    gets(buf);
    send(s,buf,strlen(buf),0);
    rc=recv(s,buf,256,0);
    buf[rc]='\0';

    ///////////////////////////////////////////

    client:

    rc=recv(connectedSocket,buf,256,0);
    buf[rc]='\0';
    printf("Gesendeter Befehl: %s\n",buf);
    rc=send(connectedSocket,buf2,strlen(buf2),0);

    ...

    jetzt will ich das aber auch umgekehrt , sodas der server senden kann aber irgentwie bekomme ich das nicht hin .....



  • das hab ich jetzt im Server drin...

    Server

    ...
     // Daten austauschen
      while(rc!=SOCKET_ERROR)
      {
        rc=recv(connectedSocket,buf,256,0); 
        buf[rc]='\0';
    
        printf("Client sendet: %s\n",buf);
        rc=send(connectedSocket,buf2,strlen(buf2),0);
        //
    
       printf("Server\n: ");
       gets(buf2);
       send(acceptSocket,buf2,strlen(buf2),0);
       rc=recv(acceptSocket,buf2,256,0);
       buf2[rc]='\0';
    
      }
    

    Client:

    ...
    char buf2[256]
    ...
      // Daten austauschen
      while(rc!=SOCKET_ERROR)
      {
        printf("\nZeichenfolge eingeben [max 256]: ");
        gets(buf);
        send(s,buf,strlen(buf),0);
        rc=recv(s,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("\nServer antwortet: %s\n",buf);
        //
        rc=recv(s,buf2,256,0); 
        buf2[rc]='\0';
        printf("Server sendet: %s\n",buf2);
        rc=send(s,buf2,strlen(buf2),0);
    
      }
    

    aber wenn ich zurück sende bekomme ich die meldung

    "Server wurde getrennt..."
    

    kann mir wer helfen ?


Anmelden zum Antworten