Server/Client in C -> GELÖST ;) minichat



  • Hallo
    ich dachte ich mache nochmals ein neues Thead auf um zu zeigen, wie man ein Chat schreibt -> mithilfe der Seite:
    http://www.c-worker.ch/tuts/wstut_op.php
    darauf befinden sich 2 Datein zum runterladen

    sock.c und socksrv.c

    achtung vor linker setzen: libw2_32.a

    -> erst Server öffnen
    -> dann Client

    in dieser Version geht der Client leider nach 1 sec
    aus wenn man zurck schreibt

    auch das Senden als Server wird im Server
    gleichzeitig mit

    client sendet:
    server: "beispieltext"

    dargestellt 😞 😞

    WARUM ????

    aber ich hoffe ich konnte ein Beitrag für die Nachwelt erstellen

    version 1.0:

    Server

    ////////////////////////////
    //   Server               // 
    ////////////////////////////
    
    #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h>
    
    //Prototypen
    int startWinsock(void);
    
    int main(int argc, char *argv[])
    { 
      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("Client sendet: %s\n",buf);
        rc=send(connectedSocket,buf2,strlen(buf2),0);
        //
    
       printf("Server: ");
       gets(buf2);
       send(connectedSocket,buf2,strlen(buf2),0);
       rc=recv(connectedSocket,buf2,256,0);
       buf2[rc]='\0';    
    
      }
    
      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;
      SOCKET connectedSocket;
    
      SOCKADDR_IN addr;
    
      char buf[256];
      char buf2[200];
    
      // Winsock starten
      rc=startWinsock();
    
      // Socket erstellen
      s=socket(AF_INET,SOCK_STREAM,0);
      connectedSocket=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));
    
      connectedSocket=accept(s,NULL,NULL);
    
      // 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);
        buf[rc]='\0';
    
        //
    
        rc=recv(connectedSocket,buf,256,0); 
        printf("Server sendet: %s\n",buf);
        rc=send(connectedSocket,buf,strlen(buf),0);
        buf[rc]='\0';
    
      }
      closesocket(s);
      closesocket(connectedSocket);
      WSACleanup();
      Sleep(1000);
      return 0;
    }
    
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    

    viel spaß damit... 🕶

    ps: die fehlermeldungun hab ich auch mal gelöscht damit man mal sieht was genau da passiert und es hält den code klein 🤡



  • HABS 😃

    bitte ändern im Server:

    Server:

    ...
    while(rc!=SOCKET_ERROR)
      {
        printf("Server: ");
    
        rc=recv(connectedSocket,buf,256,0); // hält die verbindung am laufen
    
        buf[rc]='\0'; // texteingabe auf 0 zurück setzen
        buf2[rc]='\0'; // texteingabe auf 0 zurück setzen
    
        printf("Client sendet: %s\n",buf); // zeige text an
    
        gets(buf2);  // hier wird Text eingegeben ...
    
        rc=send(connectedSocket,buf2,strlen(buf2),0); // ...und gesendet 
      }
    ...
    

    bitte ändern im Client:

    Client:

    ...
      while(rc!=SOCKET_ERROR)//rc!=SOCKET_ERROR)
      {
        printf("Client: ");
        gets(buf);
        send(s,buf,strlen(buf),0);
    
        rc=recv(s,buf,256,0);
        buf[rc]='\0';
    
        printf("\nServer antwortet: %s\n",buf);
        //
    ...
       }
    

    nur das problem ist , das der Client erst senden muss und erst wieder schreiben kann wenn der Server geantwortet hat

    ist kla es liegt ja auch an

    gets[]
    

    in der While schleife
    kann man das umgehehn ???



  • 😛
    du hast nen kleinen dreher drin

    Server:

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

    Client

    while(rc!=SOCKET_ERROR)
      {
        printf("Client: ");
    
        gets(buf);
    
        send(s,buf,strlen(buf),0);
    
        rc=recv(s,buf,256,0);
    
        buf[rc]='\0';
    
        printf("\nServer antwortet: %s\n",buf);
      }
    

    😉



  • Auch Dein Code ist nicht zu gebrauchen.


Anmelden zum Antworten