- 论坛徽章:
- 0
|
server端建立sockfd后加入fd_set进行select,发现新的连接进来时我就accept然后将新的fd加入到fd_set中,并且修改select的第一个参数max_fd,扩大select的范围,我的想法是如果有新连接进来fd_isset(sockfd)应该有反应,如果是已连接的客户端有数据进来的话,某个fd_isset(new_fd)应该有反应,相关的程序见下面.但是现在发现的问题是只能接受一个连接(我的listen的BACKLOG==10),而且这个连接的数据我能收到,但是如果再有一个连接进来,我的select好象没反应,这是为什么?max_fd应该是第一个new_fd+1应该大于sockfd+1,按我的想法,这时select应该有反应,fd_isset(sockfd)为真.
另外,如果s = max(sockfd, new_fd[n]);这句话注释掉,也就是说max_fd一直等于sockfd+1,新的连接可以进来,但是无论哪个连接都无法收到信息(这点我可以理解,虽然new_fd加入到了fd_set中,但是max_fd还是那么小).......
应该如何实现呢?另外因为是第一次写socket程序,不知道正常的处理是不是像我这样做的?请大虾们指教.
FD_SET(sockfd, &readfds);
s = sockfd;
while(1)
{
rtn = select(s + 1, &readfds, NULL, NULL, NULL);
if(rtn == -1)
{
printf("select error!\n" ;
exit(1);
}
else if(rtn == 0)
{
printf("time out!\n" ;
exit(1);
}
else
{
if(FD_ISSET(sockfd, &readfds))
{
sin_size = sizeof(their_addr);
if((new_fd[n] = accept(sockfd,
(struct sockaddr *)&their_addr, &sin_size)) == -1)
{
printf("accept error!\n" ;
continue;
}
FD_SET(new_fd[n], &readfds);
printf("server: get connection from %s\n",
inet_ntoa(their_addr.sin_addr));
s = max(sockfd, new_fd[n]);
n++;
continue;
}
for(i = 0; i < n; i++)
{
if(FD_ISSET(new_fd, &readfds))
{
if(recv(new_fd, buf, MAXDATASIZE, 0) == -1)
{
printf("receive error!\n" ;
}
printf("receive: %s\n", buf);
}
}
}
} |
|