免费注册 查看新帖 |

Chinaunix

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

通讯时select,读写集为什么都有数据 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-15 17:39 |只看该作者 |倒序浏览
这是一个网上典型的通讯应用,服务端:
mainsock = socket(AF_INET, SOCK_STREAM, 0))
setsockopt 端口重用
bind
listen
fcntl 非阻塞
FD_SET(mainsock, &Mysock.readfds);
FD_SET(mainsock, &Mysock.exceptfds);
Mysock.DaemonSock=mainsock;

while( 1 ){
    if ((retcode = select(MAXSOCKNUM, &rfds, &wfds, &efds, NULL )) == 0) 阻塞
FD_ISSET(Mysock.DaemonSock, &rfds)这句是查看是否有新的客户端连接申请,有新连接就newsock =accept(),并把newsock 用FD_SET加入“读写异常”三个集中,Mysock.Sockets[i]保存newsock
再用检查:FD_ISSET(Mysock.Sockets[i], &rfds)判断是否有可读的结果集   AA
再用检查:FD_ISSET(Mysock.Sockets[i], &wfds)判断是否有可写的结果集  BB
结果发现:第一次循环时阻塞在select处,当客户端发送conn命令时正常检查并accept,但循环回来再次select时就不阻塞了,为什么?
当服务端收到客户端发送的一个数据包时,服务端AA句检查到有可读信息,我认为合理。我可以recv并send。
但当服务端收到客户端发送的一个数据包时,BB句也会返回“真”,这是为什么呢?我觉得客户端向服务端发送数据时,服务端应该只有读集有真返回,其它不应该有啊。
谢谢。

论坛徽章:
0
2 [报告]
发表于 2006-02-15 17:44 |只看该作者
TCP协议,应该是请求和确认消息吧,ACK和SYN

论坛徽章:
0
3 [报告]
发表于 2006-02-15 20:33 |只看该作者
把FD_SET搬到循环体内

论坛徽章:
0
4 [报告]
发表于 2006-02-15 20:45 |只看该作者
打算在这里不间断地收取信息,然后返回结果。使处理效率增加。

论坛徽章:
0
5 [报告]
发表于 2006-02-15 22:06 |只看该作者
你还没有明白什么是写:)

论坛徽章:
0
6 [报告]
发表于 2006-02-16 09:15 |只看该作者
请随风详细说说。

论坛徽章:
0
7 [报告]
发表于 2006-02-16 09:19 |只看该作者
对于FH:把FD_SET搬到循环体内。那岂不成了客户端连接时fdset了,再当有数据传递时也要循环把所有的客户连接再fdset一次了,这不是重复工作吗?

[ 本帖最后由 yycfriends 于 2006-2-16 09:46 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-02-16 09:23 |只看该作者
写难道不是说send_buf里面有空位给允许写了吗?:)

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2006-02-16 09:23 |只看该作者
应该先accept
然后像FH说的那样.把FD_SET搬到循环体内

有何问题?

论坛徽章:
0
10 [报告]
发表于 2006-02-16 09:36 |只看该作者
与楼上的同感。FH是高手,不会失手。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP