"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) receivedServer
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) sendDas 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) sendKann 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!
einbuffer[bytes] = '\0';
hat gefehlt.