C 套接字:Echo 服务器错误回复

Posted

技术标签:

【中文标题】C 套接字:Echo 服务器错误回复【英文标题】:C sockets: Echo server bad reply 【发布时间】:2015-06-04 16:31:45 【问题描述】:

我已经阅读了尽可能多的问题,但我仍然有我的问题......

我有一个非常示例的客户端/服务器套接字:

服务器和客户端之间的连接已建立完成 从客户端接收消息DONE 在服务器端打印消息DONE 将消息从服​​务器发送回客户端问题 在客户端打印服务器回复问题

我将消息从客户端发送到服务器没有问题,但是当我发送回消息时,我总是收到奇怪的字符

注意:我在收到的字符串中添加了 '\0' 字符

客户端代码

//... socket initialization and other code
write(sockfd, msg, strlen(msg));    
printf("Message sent ! \n"); 

// Listen for reply
listen(sockfd, 5);
struct_size = sizeof(con_addr);
serverfd = accept(sockfd, (struct sockaddr*)&con_addr, &struct_size);

// Read message
bytes_read = read(serverfd, server_reply, 100);
server_reply[bytes_read] = '\0';
printf("Server response: %s \n", server_reply);

// Close socket
close(sockfd);
close(serverfd);
printf("Socket closed ! \n");     

服务器代码

//... socket initialization, bind and other code
struct_size = sizeof(con_addr);
if( (clientfd = accept(sockfd, (struct sockaddr*)&con_addr, &struct_size)) < 0 )
    perror("Could not accept connection. Error: ");
    return 1;


// Read message
bytes_read = read(clientfd, client_message, 100);
client_message[bytes_read] = '\0';

printf("Message received: %s \n", client_message);      
// Send message back
n = write(clientfd, client_message , strlen(client_message));    

我得到这样的东西:

Server response: �V��i�8�y�
Server response: ��ƿi�8�� 

【问题讨论】:

为什么双方都打电话accept()?要么我(最近没有使用)的套接字代码知识忘记了一些东西,要么这是不对的。我记得只有服务器会调用accept()。此外,listen() 不用于“收听回复”。它用于侦听传入的客户端(在调用accept() 之前需要)。我认为您在检查电话返回时缺乏错误检查可能会在下层地区困扰您。 您的代码在关键函数中没有错误检查。例如,如果bytes_read 是-1,你的代码会做一些疯狂的事情。您不会检查listenacceptreadwrite 中显示的代码中的错误。你怎么可能希望找出哪里出了问题? 【参考方案1】:

您对 TCP 套接字的工作方式感到困惑:

服务器通常调用socket(2)bind(2)listen(2)accept(2) 来设置其监听套接字。 客户端调用socket(2) 然后connect(2) 连接到服务器。 一旦服务器从accept(2) 成功返回,您在客户端和服务器之间就有了一个双向字节管道

目前您似乎正在尝试连接/接受双方。

其他说明:

始终检查系统调用的返回值 - -1 表示错误,然后检查 errno(3) 是否存在实际问题(strerror(3) 在这里很有用)。 不要假设数据是 ASCII,所以不要在套接字输入上使用strlen(3),使用read(2)的返回值。

【讨论】:

已修复,我现在混合了一些答案很清楚!我删除了客户端上的侦听和接受部分,并使用相同的套接字发送和接收消息。谢谢 @Liαrεz 确保添加对返回值的检查。正确的错误检查将确保您的安全,并更好地提醒您此类问题。

以上是关于C 套接字:Echo 服务器错误回复的主要内容,如果未能解决你的问题,请参考以下文章

来自 SOCKS 服务器的 Android Orbot 格式错误的回复

TCP-IP 套接字 C:尝试连接到服务器套接字时出现错误地址错误

通过C中的套接字发送IP地址

分段错误(核心转储)错误 C linux 套接字

laravel-echo-server 用户未加入,未订阅套接字服务器

C错误从流式套接字读取数据包