2010-11-13 44 views
4

我試圖做一個程序(客戶端)可以發送消息到服務器應用戶的請求。精簡的代碼如下:發送多個郵件通過發送()recv(),套接字編程,C

客戶:

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

    struct sockaddr_in servaddr; 
    int sock = socket(AF_INET, SOCK_STREAM, 0); 

    memset(&servaddr, 0, sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_port = htons(6789); 
    servaddr.sin_addr.s_addr = inet_addr(<ip_address_of_server>); 

    while(1) { 

    char message[161]; 
    fgets(message, 161, stdin); 

    /* Replacing '\n' with '\0' */ 
    char *tmp = strchr(message, '\n'); 
    if (tmp) *tmp = '\0'; 

    connect(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)); 
    send(sock, message, strlen(message), 0); 
    close(sock); 
    } 
} 

服務器:

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

    struct sockaddr_in servaddr; 
    int sock = socket(AF_INET, SOCK_STREAM, 0); 

    memset(&servaddr, 0, sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    servaddr.sin_port = htons(6789); 

    bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)); 
    listen(sock, 5); 

    while(1) { 
    int clisock = accept(sock, (struct sockaddr *) NULL, NULL); 

    if (clisock >= 0) { 
     int messageLength = 160; 
     char message[messageLength+1]; 
     int in, index = 0, limit = messageLength; 

     while ((in = recv(clisock, &message[index], messageLength, 0)) > 0) { 
     index += in; 
     limit -= in; 
     } 

     printf("%s\n", message); 
    } 

    close(clisock); 
    } 
} 

現在,這個工程的第一條消息我送。但是,它不能夠建立另一個連接(當我嘗試在客戶端程序中連接時,我得到了錯誤信息「Bad file descriptor」。)任何人都可以看到我誤解了什麼嗎?謝謝:)

+0

accept調用或recv調用都會返回錯誤。檢查它,原因將變得更清晰。 perror()對此非常方便。 (注意:如果接受返回一個錯誤,close也可能返回一個錯誤,並且最好檢查bind和listen返回值。) – Flexo 2010-11-13 12:51:22

+0

當我調用Client中的connect()時出現錯誤,並且出現錯誤消息「錯誤的文件描述符」 – ragnaroh 2010-11-13 13:42:50

+1

請記住,TCP是一個流。它沒有消息。您收到160個字節,可能是客戶端發送的幾條應用程序消息。 – nos 2010-11-13 13:57:45

回答

1

您的客戶端程序也會犯同樣的錯誤,第一次打開套接字但在第一次連接完成後關閉套接字,因此下次在循環中套接字描述符無效時,打開套接字但缺少該套接字,請從頂部刪除套接字調用,並在while循環的開始處添加以下行:

int sock = socket(AF_INET,SOCK_STREAM,0);

+0

啊..謝謝!它現在出色地工作:) – ragnaroh 2010-11-13 14:01:29

2

問題是,您正在關閉收聽套接字sock,而不是客戶端套接字clisock

+0

感謝您的回覆。我糾正了錯誤。但是,它仍然不起作用。它不再在無限循環中運行,但它似乎仍然無法連接。我檢查了套接字,綁定,監聽等的所有返回值。看起來,我在客戶端調用connect()時出現錯誤,並顯示錯誤消息「錯誤的文件描述符」。 – ragnaroh 2010-11-13 13:40:24

2
servaddr.sin_addr.s_addr = inet_addr(<ip_address_of_server>); 

,而不是在客戶端代碼上線使用以下

inet_pton(AF_INET,"<ipofserver>",&servaddr.sin_addr); 

進行了fllowing功能也是一個錯誤檢查。