"Echoserver" Problem mit recv



  • Hallo,
    Ich habe mit ein Server/Client paar geschreiben zum Testen geschreiben.
    Der Client sendet ASCII-Zeichen an den Server, der schick sie nur unverändert zurück.

    client

    Connected ...
    f
    --> f (1 Bytes) send
    <-- f (1 Bytes) received
    d
    --> d (1 Bytes) send
    <-- d (1 Bytes) received

    Server

    Listing to port: 2007
    Client connected [127.0.0.1:35017]
    <-- f (1 Bytes) received
    --> f (1 Bytes) send
    <-- d (1 Bytes) received
    --> d (1 Bytes) send

    Das Problem: Wenn ich die Puffergrösse(BUFFSIZE) beim recv verkleinere (ca. 100) kommt nur noch mist raus:

    Listing to port: 2007
    Client connected [127.0.0.1:64474]
    <-- dÐè¿¿·ð(
    x¹(Ðè¿¿G"(À¡(
    (1 Bytes) received
    ^[[?1;2c --> dÐè¿¿·ð(
    x¹(Ðè¿¿G"(À¡(
    (36 Bytes) send

    Kann mir jemand sagen, woran das liegen kann?
    PS: Das ist eines meiner ersten Client/Server Programme, darum wäre ich sehr an Kritik zum Code interessiert.
    Danke.

    /*************************************************
     *   ECHO SERVER
     *************************************************/
    
    #define PORT      2007
    #define BUFFSIZE  100
    
    /*************************************************
     *   LISTEN TO A SOCKET
     *************************************************/
    int server_listen(void){
    
       int _socket;
       struct sockaddr_in sa;
    
       sa.sin_family        = AF_INET;
       sa.sin_port          = htons(PORT);
       sa.sin_addr.s_addr   = htonl(INADDR_ANY);
    
       /* get a socket file deskriptor */
       if( (_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) ) < 0 ) {
          perror("socket() failed");
          return 0;
       }
    
       /* bind socket */
       if ( bind( _socket, (struct sockaddr *) &sa, sizeof(sa)) < 0 ) {
          perror("bind() failed");
          return 0;
       }
    
       /* listen to socket */
       if( listen( _socket, 3) < 0 ){
          perror("listen() failed");
          return 0;
       }
    
       printf("Listing to port: %i\n",PORT);
    
       return _socket;
    }
    /*************************************************
     *   MAIN 
     *************************************************/
    
    int main(void){
    
       int _socket, _session;
       int bytes;
       char buffer[BUFFSIZE];
    
       struct sockaddr_in peer;
       size_t peer_size;
    
       peer_size = sizeof(peer);
    
       /* create a listen socket */
       _socket = server_listen();
    
       while(1){
    
          /* wait for client */
          if ( (_session = accept(_socket, (struct sockaddr *) &peer, &peer_size) ) < 0 ) {
             perror("accept() failed");
             return 1;
          }
    
          /* client connected */
          printf("Client connected [%s:%i]\n",inet_ntoa(peer.sin_addr),peer.sin_port);
    
          /* send all back u recv */
          while(1){
             /* receiving */
             bytes = recv( _session, buffer, BUFFSIZE, 0);
    
             if( bytes <= 0 ){ break; } // client closed con.
    
             printf(" <-- %s (%i Bytes) received \n",buffer,bytes);
    
             /* sending */ 
             bytes = send( _session, buffer, strlen(buffer) ,0 );
             if( bytes < 0){ perror("send error"); }
             printf(" --> %s (%i Bytes) send \n",buffer,bytes);
          }
    
          printf("Connection closed by client\n");
       }  
       return 0;
    }
    
    /*************************************************
     *   ECHO CLIENT
     *************************************************/
    
    #define HOST      "localhost"
    #define PORT      2007
    #define BUFFSIZE  2048
    
    /*************************************************
     *   CONNECT TO A SERVER
     *************************************************/
    
    int client_connect(void){
    
       int _socket;
       struct  hostent *host;
       struct sockaddr_in sa;
    
       host = gethostbyname(HOST);
    
       sa.sin_family  = AF_INET;
       sa.sin_port    = htons(PORT);
       sa.sin_addr = *(struct in_addr*) host->h_addr;
    
       /* get a socket file deskriptor */
       if( (_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) ) < 0 ) {
          perror("socket() failed");
          return 0;
       }
    
       /* connect to the server */
       if( connect( _socket, (struct sockaddr *) &sa, sizeof(sa) ) < 0) {
          perror("connect() failed");
          return 0;
       }
    
       printf("Connected ...\n");
       return _socket;
    }
    /*************************************************
     *   MAIN
     *************************************************/
    
    int main(void){
    
       int _session;
       int bytes;
       char buffer[BUFFSIZE];
    
       if( !(_session = client_connect()) ) return 1;
    
       while(1){
    
          /* sending */
          scanf(" %2047s",buffer);
          bytes = send( _session, buffer, strlen(buffer), 0);
    
          if( bytes < 0){ perror("send error"); }
          printf(" --> %s (%i Bytes) send \n",buffer,bytes);
    
          /* receiving */
          bytes = recv( _session, buffer, BUFFSIZE, 0);
          if( bytes <= 0 ){ break; }
          printf(" <-- %s (%i Bytes) received \n",buffer,bytes);
    
       }
       return 0;
    }
    


  • Schlagt mich!
    ein

    buffer[bytes] = '\0';
    

    hat gefehlt.


Anmelden zum Antworten