1.recv触发情况
用错了socket,把监听socket 和 连接socket 错误使用。实例如下:
for(;;){
socklen_t len = sizeof(client_address);
connfd = accept(listenfd, (struct sockaddr *)&client_address, &len);
if(connfd < 0){
printf("accept error: %s\n", strerror(errno));
}
printf("server get connection from %s\n", inet_ntop(AF_INET, &client_address.sin_addr, buff, sizeof(buff)));
if((n = read(listenfd, message, 1024)) == -1){
printf("read error: %s\n", strerror(errno));
exit(1);
}
message[n] = '\0';
printf("receive the message of client: %s\n", message);
close(connfd);
}
上面的代码为server端的接收client链接请求并显示client传过来的信息, accept函数成功后返回一个内核生成的一个全新的描述符 赋值给connfd, 所以后面调用read()函数时, 第一个参数应该是connfd 而不是 listenfd。 所以代码第9行应该改为
if((n = read(connfd, message, 1024)) == -1){
2.shutdown触发情况
客户端socket 已经关闭的情况,服务器端socket 调用shutdown 则会出现这个错误。
本文深入探讨了在Socket编程中常见的两种错误:一是错误地在监听socket上进行recv操作,二是shutdown函数在客户端socket已关闭的情况下被服务器端socket调用。通过具体的代码示例,详细分析了这些错误的发生原因,并提供了正确的解决方案。
3753

被折叠的 条评论
为什么被折叠?



