2016-04-14 7 views
0

Ich habe einen Code für einen einfachen Client/Server geschrieben. Der Code führt Folgendes aus, wenn er ausgeführt wird.Client & Server-Spülungspuffer

Zuerst wartet der Server auf eine Nachricht vom Client und fordert dann den Benutzer auf, eine Nachricht zum Senden an den Client einzugeben. Wenn der Client zum ersten Mal gestartet wird, fordert er den Benutzer auf, eine Nachricht einzugeben, die an den Server gesendet werden soll, und wartet dann auf eine Antwort vom Server.

Das Programm funktioniert gut, wenn ich die erste Nachricht von dem Client an den Server senden, scheint es, und dann der Server fragen Sie mir eine Nachricht zu schreiben, um dem Kunden hier das Problem zu senden beginnt:

ich den Typ Nachricht und drücken Sie die Eingabetaste Die Nachricht wird an den Client gesendet und dann erhält der Server die gleiche vorherige Nachricht und fordert mich auf, eine Nachricht für den Client einzugeben. Nachrichten, die entweder vom Server oder vom Client gesendet werden, werden nicht sofort gelesen und gedruckt, es sei denn, ich gebe dem Server eine andere Nachricht ein und zeigt dann die vorherige Nachricht an, die vom Client gesendet wurde.

Server-Code:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 
#include <netdb.h> 

static void bail(const char* on_what){ 
fputs(strerror(errno),stderr); 
fputs(": ",stderr); 
fputs(on_what,stderr); 
fputc('\n',stderr); 
exit(1); 
} 

int main(int argc, char** argv) { 

int sockfd, bindfd, listenfd, acceptfd, writefd, readfd, len_inet; 
struct sockaddr_in address_server, address_client; 
char *server_address = "192.168.1.10"; 
char *server_portno = "9100"; 
char readBuffer[256], writeBuffer[256]; 

memset(&address_server, 0, sizeof address_server); 
address_server.sin_family = AF_INET; 
address_server.sin_port = htons(atoi(server_portno)); 
address_server.sin_addr.s_addr = inet_addr(server_address); 
if(address_server.sin_addr.s_addr == INADDR_NONE) 
    bail("bad address"); 

sockfd = socket(AF_INET, SOCK_STREAM, 0); 
if(sockfd == -1) 
    bail("socket()"); 
printf("socket created\n"); 

bindfd = bind(sockfd, (struct sockaddr *)&address_server, sizeof address_server); 
if(bindfd == -1) 
    bail("bind()"); 
printf("bind done\n"); 

listenfd = listen(sockfd, 10); 
if(listenfd == -1) 
    bail("listen()"); 
printf("Listening to Client\n"); 

len_inet = sizeof address_client; 

acceptfd = accept(sockfd, (struct sockaddr *)&address_client, &len_inet); 
if(acceptfd == -1) 
    bail("accept()"); 
    printf("Connection accepted\n"); 

while(1){ 

    printf("Reading from Client...\n"); 
    readfd = read(acceptfd, &readBuffer, sizeof readBuffer-1); 
    if(readfd == -1) 
     bail("read()"); 

    printf("Message from Client: %s\n", readBuffer); 

    printf("Enter a message to send to Client:\n"); 
    fgets(writeBuffer, 255, stdin); 
    writefd = write(acceptfd, writeBuffer, sizeof writeBuffer); 
    if(writefd == -1) 
     bail("write()"); 
} 

close(acceptfd); 
printf("Closing Connection\n"); 

return (EXIT_SUCCESS); 
} 

Client-Code:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <arpa/inet.h> 
#include <netinet/in.h> 

void static bail(const char* on_what){ 
fputs(strerror(errno),stderr); 
    fputs(": ",stderr); 
    fputs(on_what,stderr); 
    fputc('\n',stderr); 
    exit(1); 
} 

int main(int argc, char** argv){ 

int sockfd, connectfd, readfd, writefd, len_inet; 
struct sockaddr_in address_server; 
char *server_address = "192.168.1.240"; 
char *server_portno = "9100"; 
char readBuffer[256], writeBuffer[256]; 

memset(&address_server, 0, sizeof address_server); 
address_server.sin_family = AF_INET; 
address_server.sin_port = htons(atoi(server_portno)); 
address_server.sin_addr.s_addr = inet_addr(server_address); 
if(address_server.sin_addr.s_addr == INADDR_NONE) 
    bail("bad address"); 

sockfd = socket(AF_INET, SOCK_STREAM, 0); 
if(sockfd == -1) 
    bail("socket()"); 
printf("socket created\n"); 

len_inet = sizeof address_server; 

connectfd = connect(sockfd, (struct sockaddr *)&address_server, len_inet); 
if(connectfd == -1) 
    bail("connect()"); 
printf("Connected\n"); 

while(1){ 
    printf("Please enter a message to send to the Server: \n"); 
    fgets(writeBuffer, 255, stdin); 
    writefd = write(sockfd, writeBuffer, sizeof writeBuffer); 
    if(writefd == -1) 
     bail("write(2)"); 

    printf("Waiting for a message from the server\n"); 
    readfd = read(sockfd, &readBuffer, sizeof readBuffer-1); 
    if(readfd == -1) 
     bail("read(2)"); 
    readBuffer[readfd] = 0; 
    printf("Message from the server: %s\n", readBuffer); 
} 

close(sockfd); 
printf("Connection Closed\n"); 

return 0; 
} 
+0

fo Die Verständlichkeit und Lesbarkeit durch uns Menschen: 1) durchgängig einrücken. Einzug nach jeder öffnenden Klammer '{'. vor jeder schließenden Klammer '}' einrücken. – user3629249

+0

Einrücken mehrerer Anweisungen nach einer 'if()' Anweisung macht nicht mehrere Anweisungen Teil des 'if' Code-Block. Nur das Wrappen der Anweisungen in Klammern macht das möglich. – user3629249

+0

Aktivieren Sie beim Kompilieren immer alle Warnungen und beheben Sie diese Warnungen. (für 'gcc', mindestens verwenden:' -Wall -Wextra -pedantic' Ich benutze auch: '-Wconversion -std = gnu99') Der gepostete Code veranlasst den Compiler, viele Warnmeldungen zu erzeugen. Alle diese Warnungen müssen korrigiert werden. – user3629249

Antwort

2

Es gibt mehrere Probleme im Code, in Server:

printf("Reading from Client...\n"); 
readfd = read(acceptfd, &readBuffer, sizeof readBuffer-1); 
if(readfd == -1) 
    bail("read()"); 

Readbuffer ein Array ist, als bestanden, wenn nach eine Funktion, es ist bereits ein Zeiger auf sein erstes Element, so dass Sie & readBuffer nicht verwenden können, nur Sie se Readbuffer, dann nach zu lesen, müssen Sie den Puffer beenden, als Strings in C sind nur char-Arrays beendet null:

printf("Reading from Client...\n"); 
readfd = read(acceptfd, readBuffer, sizeof readBuffer-1); 
if(readfd == -1) 
    bail("read()"); 
readBuffer[readfd] = '\0'; 

fgets Sie nicht wissen, wie viele Zeichen es in den Puffer liest, so dass Sie nicht nur der gesamte Puffer in die Steckdose, schreiben die Zeichenfolge stattdessen verwenden strlen die Größe der Zeichenfolge, die Sie schreiben müssen:

writefd = write(acceptfd, writeBuffer, strlen(writeBuffer)); 

im Client die gleichen Probleme mit Puffer:

writefd = write(sockfd, writeBuffer, strlen(writeBuffer)); 
... 
readfd = read(sockfd, readBuffer, sizeof readBuffer-1); 
readBuffer[readfd] = '\0'; 
Verwandte Themen