- 论坛徽章:
- 0
|
这是一个网上典型的通讯应用,服务端:
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句也会返回“真”,这是为什么呢?我觉得客户端向服务端发送数据时,服务端应该只有读集有真返回,其它不应该有啊。
谢谢。 |
|