2015-09-17 22 views
0
// A simple echo server 
// ./server port_no 

#include<stdio.h> 
#include<stdlib.h> 
#include<sys/socket.h> 
#include<sys/types.h> 
#include<netinet/in.h> 
#include<error.h> 
#include<strings.h> 
#include<unistd.h> 
#include<arpa/inet.h> 



#define ERROR -1 
#define MAX_CLIENTS 2 
#define MAX_DATA 1024 



main(int argc, char **argv) 
{ 
    struct sockaddr_in server; 
    struct sockaddr_in client; 
    int sock; 
    int new; 
    int sockaddr_len = sizeof(struct sockaddr_in); 
    int data_len; 
    char data[MAX_DATA]; 


    if((sock = socket(AF_INET , SOCK_STREAM, 0)) == ERROR) 
    { 
     perror("server socket: "); 
     exit(-1); 
    } 

    server.sin_family = AF_INET; 
    server.sin_port = htons(atoi(argv[1])); 
    server.sin_addr.s_addr = INADDR_ANY; 
    bzero(&server.sin_zero,8); 


    if((bind(sock , (struct sockaddr *)&server, sockaddr_len)) == ERROR) 
    { 
      perror("bind : "); 
      exit(-1); 
    } 

    if((listen(sock, MAX_CLIENTS)) == ERROR) 
    { 
     perror("listen"); 
     exit(-1); 
    }   

    while(1) //Better signal handling required 
    { 
     if((new == accept(sock, (struct sockaddr *)&client , &sockaddr_len)) == ERROR) 
     { 
     perror("accept"); 
     exit(-1); 
     } 


printf("New Client connected from port no %d and IP %s\n",ntohs(client.sin_port),inet_ntoa(client.sin_addr)); 
data_len = 1; 

while(data_len) 
    {  
     data_len = recv(new,data , MAX_DATA, 0); 

      if(data_len) 
       { 
        send(new, data, data_len, 0); 
        data[data_len] = '\0' ; // null the last byte to detect string 
        printf("Sent mesg: %s", data); 
       } 
    } 

printf("Client disconnected\n"); 

close(new); 
} 


close(sock); 

} 

嗨,我一直在學習套接字編程C語言。最近我寫了一個tcp echo服務器的代碼。服務器不顯示連接當我使用netstat命令,但只要我運行代碼使用telnet它開始打印無限的消息,而不是等待我在其他終端寫入消息。請幫我弄清楚我哪裏出錯了。如何阻止我的tcp echo服務器以正確的方式工作?

+3

請告訴我們實際的輸出是什麼。正在打印的信息顯然很重要,因爲它會告訴程序停滯在哪裏。但對於初學者,'while(data_len)'和'if(data_len)'是錯誤的。 'recv'在錯誤時返回'-1',在C中,任何非零值在作爲條件使用時計算結果爲true。所以這些檢查不能正確區分成功和錯誤。 – kaylum

回答

0

的原因無限循環的代碼

f((new == accept(sock, (struct sockaddr *)&client , &sockaddr_len)) == ERROR) 

應該改爲

f((new = accept(sock, (struct sockaddr *)&client , &sockaddr_len)) == ERROR) 

它的== VS =。對於==,由accept()返回的套接字永遠不會被分配給new,因此對它調用recv()會返回-1(在這種情況下爲錯誤),並且由於代碼不檢查錯誤,正如Alan指出的Au,結果是一個無限循環。

順便說一句,如果您通過使用開關來觀察編譯器警告或啓用更多警告,例如使用gcc,通常可以對代碼的可能問題進行一些深入的瞭解。

相關問題