2013-09-25 25 views
1

我正在寫一個服務器客戶端聊天程序在Linux中。由於某些原因,代碼無法正常工作。服務器客戶端程序未定義的行爲

的問題是在客戶端代碼,while循環中,連續服用輸入編譯器doesn't wait at scanf,而是sends some garbage data itself to the server,作爲回報,服務器還發送一些數據和client program terminates

由於我的知識有限,我無法弄清楚問題所在,您的幫助將不勝感激。

Server.c

#define PORT 3690 

#define MaxBufferLength 1024 


int main() 
{ 
    int sockFd, bytesRead, bytesSent; 

    char buffer[MaxBufferLength]; 

    struct sockaddr_in server, client; 


    server.sin_port= htons(PORT); 
    server.sin_family = AF_INET; 
    server.sin_addr.s_addr = htonl(INADDR_ANY); 
    sockFd = socket(AF_INET, SOCK_STREAM, 0); 


    if(sockFd == -1) 
     printf("Unable to open socket\n"); 


    int i = bind(sockFd, (struct sockaddr *) &server, sizeof(struct sockaddr)); 

    if(i == -1) 
     perror("Unable to bind\n"); 



    i = listen(sockFd, 1); 

    if(i == -1) 
     printf("Unable to listen\n"); 




    int connectionSocket = accept(sockFd, (struct sockaddr *) &client, sizeof(struct sockaddr)); 

    if(connectionSocket == 1) 
     printf("connection established\n"); 


    while(1) 
    {   
     bytesRead = recv(connectionSocket, buffer, MaxBufferLength, 0); 

     buffer[bytesRead] = '\0'; 

     printf("Client said: \n  %s\n", buffer); 


     scanf("\n\n = %s", buffer); 

     bytesSent = send(connectionSocket, buffer, strlen(buffer), 0); 

     if(bytesSent == -1) 
      perror("Failed to send a message"); 

     connectionSocket = accept(sockFd, (struct sockaddr *) &client, sizeof(struct sockaddr)); // wait for connection again 
    } 


    close(sockFd); 

    return 0; 



} 

問候

+0

是否該做的每一次?或僅在您的第一條消息之後? –

+0

每次都會發生。 – Naruto

+3

看起來您正嘗試使用scanf()將輸出(即「輸入消息:」)輸出給用戶。我不認爲這是scanf()能做的事情;你最好做一個printf(「輸入消息:」); fflush(stdout中); scanf(「%s」,緩衝區);而不是 –

回答

1

你的程序幾乎很好,除了一個主要東西,accept()功能。

  1. 接受函數的最後一個參數應該是結構,其中作爲要傳遞的可變數據作爲參數的含大小reference to size_t or int變量。原因在於no connection between server and client,這就是爲什麼你面臨這種未定義的行爲。

  2. 我想你忘了scanf的語法:)。 Don't display message in it for taking input

  3. 最後一件事是在char數組的末尾添加一個空字符。

希望這有助於

1

我認爲你需要終止您buffer

 buffer[N_from_scanf] = '\0'; 

在發送前。

+0

我在問題中提到,在客戶端程序中,編譯器不會等待我輸入內容。它跳過scanf並直接發送一些垃圾數據,然後終止。 – Naruto

2

這可能會導致問題。

sizeof(struct sockaddr) ==>sizeof(struct sockaddr_in) or sizeof(server) 

int connection = connect(sockFd, (struct sockaddr *) &server, sizeof(server)) 

scanf("Enter message: \n\n = %s", buffer); 
      | 
      V 
printf("Enter message: "); 
scanf("%s",buffer); 

看到Networking and Socket programming tutorial in C

0

假設你確實正確的客戶端和服務器,你的問題可能之間的連接你如何在這兩個使用的scanf() client.c和server.c。您應該使用printf寫入stdout。您也可以使用fprintf()將套接字描述符直接傳遞給該函數,而不是使用send()和fscanf以及描述符來接收消息。