免费注册 查看新帖 |

Chinaunix

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

socket多个客户端连一个server问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-03-15 18:10 |只看该作者 |倒序浏览
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);
                }
            }
        }
    }

论坛徽章:
0
2 [报告]
发表于 2005-03-15 21:23 |只看该作者

socket多个客户端连一个server问题

s = max(sockfd, new_fd[n]);
逻辑有问题.
另外最好把LISTENING SOCKET 设成NONBLOCK的.

论坛徽章:
0
3 [报告]
发表于 2005-03-15 22:57 |只看该作者

socket多个客户端连一个server问题

这个max有问题?
写的是#define max(a,b)  a>;b?a:b
哪有问题?

论坛徽章:
0
4 [报告]
发表于 2005-03-15 23:03 |只看该作者

socket多个客户端连一个server问题

没看出来?
用ID:1,100,10看看什么结果?

论坛徽章:
0
5 [报告]
发表于 2005-03-15 23:15 |只看该作者

socket多个客户端连一个server问题

这个我想过,不过我现在是简单化了,因为我只能接受第一个连接,而第一个new_fd应该来说是比sockfd要大的,maxfd=new_fd+1,第二个连接应该能被select到吧,为什么没反应?

论坛徽章:
0
6 [报告]
发表于 2005-03-16 09:32 |只看该作者

socket多个客户端连一个server问题

how could you make that a assumption?
and by the way, how could you prvent there is no other connection could be involved?

论坛徽章:
0
7 [报告]
发表于 2005-03-16 10:30 |只看该作者

socket多个客户端连一个server问题

select每次返回时 你的readfds都会只剩下准备就绪的描述符,其他没反应的描述符被清除了。应该保存一个savefd;每次循环一次,重新readfds=savefd;

论坛徽章:
0
8 [报告]
发表于 2005-03-16 10:53 |只看该作者

socket多个客户端连一个server问题

nod,就是上面这位老兄说的.谢谢

论坛徽章:
0
9 [报告]
发表于 2005-03-16 11:14 |只看该作者

socket多个客户端连一个server问题

你这样能保证只有一个连接?
恐怕不能.

论坛徽章:
0
10 [报告]
发表于 2005-03-16 11:56 |只看该作者

socket多个客户端连一个server问题


SELECT_TUT(2)              Linux Programmer's Manual             SELECT_TUT(2)


ARGUMENTS
       readfds
              This set is watched to see if data is available for reading from
              any of its file descriptors. After select has returned,  readfds
              will  be  cleared  of all file descriptors except for those file
              descriptors that are immediately available for  reading  with  a
              recv()  (for  sockets) or read() (for pipes, files, and sockets)
              call.

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP