2010-11-13 33 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功能也是一个错误检查。