- 论坛徽章:
- 0
|
怎样知道select的fd_set数组的哪个socket是可以读写的??
老兄,select()调用的时候,是要告诉系统你想对什么事件进行关注:读,写或其他网络事件。
select(maxfd,&sockset,NULL,NULL,NULL);
第一个参数表示比所关注的fd最大的+1,
第二个参数表示你想关注读事件的句柄集合
第三个参数表示你想关注写事件的句柄集合
第四个参数表示你想关注其他网络事件的句柄集合
第五个参数表示等待时间
现在分析你的代码:
fd_set sockset;
FD_ZERO(sockset);
FD_SET(socket,&sockset);
int maxfd = sockfd+1;
while(1){
select(maxfd,&sockset,NULL,NULL,NULL); /* 假设你的select调用没有返回错误 */
if(FD_ISSET(sockfd,&sockset)) /* 表示有一个连接进入 */
{
int new_fd = accept(.............); /* 创建一个新的socket fd,还有,你这个地方的new_fd是个局部变量,作用域到下一个}为止,但你后面还引用之,错! */
FD_SET(new_fd,&sockset); /* 将new_fd加入关注事件句柄组:大错特错。在select返回后,sockset中所包含的是发生了特定事件的句柄的位图,一般而言应该在下次select调用前重新FD_ZERO(), FD_SET()一遍。而你直接将new_fd加入,现在sockset中应该包含了new_fd和socket的位图 */
}
if(FD_ISSET(new_fd,&sockset)) /* 这样做相当于int i = 1; if (i == 1) {}这样的代码,有意义吗? */
{
/* 当然应该了,因为是你自己设上去的嘛 */
recv(.......);//不应该进来啊,因为new_fd是刚创建的,而且客户也没有
//发送数据,客户唯一的操作就是connect
}
给你个正确的:
fd_set sockset;
FD_ZERO(sockset);
FD_SET(socket,&sockset);
int maxfd = sockfd+1;
int new_fd = -1;
while(1) {
select(maxfd,&sockset,NULL,NULL,NULL);
if (FD_ISSET(new_fd, &sockset))
{
recv....
close(new_fd);
new_fd = -1;
}
if(FD_ISSET(sockfd,&sockset))
{
if (new_fd >;= 0)
close(new_fd);
new_fd = accept(.............);
}
FD_ZERO(sockset);
FD_SET(socket, &sockset);
if (new_fd >;= 0)
FD_SET(new_fd);
} /* end while */
写的不好,请斧正,谢谢 |
|