免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1735 | 回复: 5
打印 上一主题 下一主题

[C] 网络编程中遇到的奇怪问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-17 14:08 |只看该作者 |倒序浏览
客户端和服务端连接正常建立之后,客户端休眠2秒,而服务端将连接关闭。2秒后客户端向套接字发送数据,第一次发送是成功的,而第二次产生SIGPIPE信号,write返回EPIPE。

请问为什么连接已经关闭了,第一次还能发送成功?

我的环境是AIX5.3

论坛徽章:
0
2 [报告]
发表于 2008-12-17 14:25 |只看该作者
UNIX网络编程 5.13节对这个问题有讲解。

论坛徽章:
0
3 [报告]
发表于 2008-12-17 14:26 |只看该作者
服务端关闭套接字只是表示不能向套接口写东西了,所以客户端还是可以发送消息。而第一次write引发服务端返回一个RST。。。

论坛徽章:
0
4 [报告]
发表于 2008-12-17 14:27 |只看该作者

回复 #2 scutan 的帖子

恩,刚刚看到的,谢谢了!

论坛徽章:
0
5 [报告]
发表于 2008-12-17 14:36 |只看该作者
学习了

论坛徽章:
0
6 [报告]
发表于 2008-12-17 15:52 |只看该作者
目前遇到一个新的问题。服务端设计比较简单,接收8次数据之后将套接口关闭,客户端部分代码如下:
int rt;
char a[5000];
fd_set rset, wset;
FD_ZERO(&rset);
FD_ZERO(&wset);

while (1) {
    FD_SET(sock, &rset);
    FD_SET(sock, &wset);
    select(sock + 1, &rset, &wset, NULL, NULL);
   
    if (FD_ISSET(sock, &rset)) {
        rt = recv(sock, a, 1000, 0);
        if (rt < 0) {
            printf("recv error:%s\n", strerror(errno));
        }
    }
   
    if (FD_ISSET(sock, &wset)) {
        rt = write(sock, a, 5000);
        if (rt < 0) {
            printf("send error:%s\n", strerror(errno));
        } else {
            printf("send 5000 bytes\n");
        }
    }
}

客户端的部分log如下:
1.
send 5000 bytes
send 5000 bytes
send 5000 bytes
send 5000 bytes
send 5000 bytes
send 5000 bytes
catch SIGPIPE
send error:Broken pipe
recv error:Connection reset by peer
2.
send 5000 bytes
send 5000 bytes
send 5000 bytes
send 5000 bytes
send 5000 bytes
send 5000 bytes
recv error:Connection reset by peer
catch SIGPIPE
send error:Broken pipe

请问为什么会出现第一种log,按理说不是应该recv先报错吗?
谢谢解答!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP