2013-03-28 69 views
2

我是套接字編程和C的新手。我正在創建一個簡單的echo客戶端服務器應用程序,該應用程序可以在教程後使用線程支持多個客戶端C客戶端服務器回聲程序在客戶端顯示無效的消息

在應用程序一切正常,除了客戶端的回聲無效的消息精細 看來它代替我輸入

最長的消息我使用的是Windows 7的

的VMware在Fedora 14終端工作的第一個字符

這是我如何編譯和運行客戶端和服務器

服務器

[[email protected] ~]$ gcc -pthread -o s server.c 
[[email protected] ~]$ ./s 
Socket created 
bind done 
Waiting for incoming connections... 
Connection accepted 

* 客戶//這裏的問題是*

[[email protected] ~]$ gcc client.c -o c 
[[email protected] ~]$ ./c 
Socket created 
Connected 

Enter message : Hello 
Server reply : 
Hello 
Enter message : 123 
Server reply : 
123lo 
Enter message : x 
Server reply : 
x23lo 
Enter message : y 
Server reply : 
y23lo 
Enter message : 

以下是我的代碼

//服務器代碼

#include<stdio.h> 
#include<string.h> //strlen 
#include<sys/socket.h> 
#include<arpa/inet.h> //inet_addr 
#include<unistd.h> //write 

int main(int argc , char *argv[]) 
{ 
    int socket_desc , client_sock , c , read_size; 
    struct sockaddr_in server , client; 
    char client_message[2000]; 

    //Create socket 
    socket_desc = socket(AF_INET , SOCK_STREAM , 0); 
    if (socket_desc == -1) 
    { 
     printf("Could not create socket"); 
    } 
    puts("Socket created"); 

    //Prepare the sockaddr_in structure 
    server.sin_family = AF_INET; 
    server.sin_addr.s_addr = INADDR_ANY; 
    server.sin_port = htons(8888); 

    //Bind 
    if(bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0) 
    { 
     //print the error message 
     perror("bind failed. Error"); 
     return 1; 
    } 
    puts("bind done"); 

    //Listen 
    listen(socket_desc , 3); 

    //Accept and incoming connection 
    puts("Waiting for incoming connections..."); 
    c = sizeof(struct sockaddr_in); 

    //accept connection from an incoming client 
    client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c); 
    if (client_sock < 0) 
    { 
     perror("accept failed"); 
     return 1; 
    } 
    puts("Connection accepted"); 

    //Receive a message from client 
    while((read_size = recv(client_sock , client_message , 2000 , 0)) > 0) 
    { 
     //Send the message back to client 
     write(client_sock , client_message , strlen(client_message)); 
    } 

    if(read_size == 0) 
    { 
     puts("Client disconnected"); 
     fflush(stdout); 
    } 
    else if(read_size == -1) 
    { 
     perror("recv failed"); 
    } 

    return 0; 
} 

//客戶端代碼

#include<stdio.h> 
#include<string.h> 
#include<sys/socket.h> 
#include<arpa/inet.h> 

int main(int argc , char *argv[]) 
{ 
    int sock; 
    struct sockaddr_in server; 
    char message[1000] , server_reply[2000]; 

    //Create socket 
    sock = socket(AF_INET , SOCK_STREAM , 0); 
    if (sock == -1) 
    { 
     printf("Could not create socket"); 
    } 
    puts("Socket created"); 

    server.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(8888); 

    //Connect to remote server 
    if (connect(sock , (struct sockaddr *)&server , sizeof(server)) < 0) 
    { 
     perror("connect failed. Error"); 
     return 1; 
    } 

    puts("Connected\n"); 

    //keep communicating with server 
    while(1) 
    { 
     printf("Enter message : "); 
     scanf("%s" , message); 

     //Send some data 
     if(send(sock , message , strlen(message) , 0) < 0) 
     { 
      puts("Send failed"); 
      return 1; 
     } 

     //Receive a reply from the server 
     if(recv(sock , server_reply , 2000 , 0) < 0) 
     { 
      puts("recv failed"); 
      break; 
     } 

     puts("Server reply :"); 
     puts(server_reply); 
    } 

    close(sock); 
    return 0; 
} 

回答

1

你必須memset的你在你的單詞,如最後位置接收緩衝區或添加 '\ 0':

這是你的代碼:

while((read_size = recv(client_sock , client_message , 2000 , 0)) > 0) 
{ 
    //Send the message back to client 
    write(client_sock , client_message , strlen(client_message)); 
} 

修改:

memset(client_message, 0x00, 2000); 
while((read_size = recv(client_sock , client_message , 2000 , 0)) > 0) 
{ 
    //Send the message back to client 
    write(client_sock , client_message , strlen(client_message)); 
} 

或修改:

while((read_size = recv(client_sock , client_message , 2000 , 0)) > 0) 
{ 
    *(client_message + read_size) = '\0'; 
    //Send the message back to client 
    write(client_sock , client_message , strlen(client_message)); 
} 
+0

非常感謝MYMNeo。第二個選項解決了問題:)再次感謝 – 2013-03-28 02:58:10

0

我知道這是一個老問題。 我確實看到有一個稍微簡單的解決方案。

有沒有必要做strlen的。 由於數據的長度已知,所以只需重新使用read_size即可。

while((read_size = recv(client_sock , client_message , 2000 , 0)) > 0) 
{ 
    //Send the message back to client 
    write(client_sock , client_message , read_size); 
}