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,你的代码会做一些疯狂的事情。您不会检查listen
、accept
、read
或write
中显示的代码中的错误。你怎么可能希望找出哪里出了问题?
【参考方案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:尝试连接到服务器套接字时出现错误地址错误