| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1263 人关注过本帖
标题:请问 select客户端服务器 通信的改进
只看楼主 加入收藏
xbubblex
Rank: 1
等 级:新手上路
帖 子:11
专家分:4
注 册:2012-7-13
结帖率:0
收藏
已结贴  问题点数:20 回复次数:6 
请问 select客户端服务器 通信的改进
编了一个小例子 实现 一个服务端和多个客户端通信的例子  
程序代码:

#include "inet.h"
#define BUFSIZE 1024

int server(int fd){
    char b[BUFSIZE];
    int n;

    if((n = read(fd, b, BUFSIZE)) < 0)
        return 0;
    b[n] = '\0';
    printf("fd = %d, n = %d, b = \"%s\"\n", fd, n, b);

    return n;
}

void error(char *s)

int main(int argc, char **argv){
    int sockfd, newfd;
    struct sockaddr_in sin, cli;
    int chilen;
    fd_set allfds, fds;       
    int fd;

    if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
        error("cannot create socket");
    bzero((char*)&sin, sizeof(sin));
    sin.sin_family = PF_INET;
    sin.sin_addr.s_addr = htonl(INADDR_ANY);
    sin.sin_port = htons(SERVER_PORT);
    if(bind(socked, (struct sock add *)&sin, sizeof(sin)) <0)
        error("cannot bind");

    if(listen(socked, 5) <0)
        error("cannot listen");
    FD_ZERO(&allfds);
    FD_SET(sockfd, &allfds);
    while(1) {
        fds = allfds;
        if (select(FD_SETSIZE, &fds, NULL , NULL ,NULL) < 0)    
            error("cannot select");
        for(fd = 0; fd < FD_SETSIZE; fd++)
            if(FD_ISSET(fd, $fds)) {
                if(fd == sockfd) {
                    clilen = sizeof(cli);
                    if ( (newfd = accept(socked, (struct sockaddr *)&cli, &chilen)) < 0)
                        error("cannot accept");
                        printf("Accepted new connection fd = %d\n", fd);
                        FD_SET(newfd, &allfds);
                } else if (server(fd) = 0) {
                    printf("Closed connection : fd = %d\n", fd);
                    if(shutdown(fd, SHUT_RDWR) <0)
                        error("cannot shutdown");
                    FD_CLR(fd,&allfds);
                    close(fd); 
                }
            }
    }
    return 0;
}


这个例子里对 服务器 对于所有可能的入力出力文件描述符 》》》 fdset表现的所有bit一个一个的检查(是否是这样理解呢?)
比如这种情况下 有   6 5 4 3 2 1 0  个文件描述符号  服务器端就得 每次0 1 2 3 4 5 6 ,0 1 2 3 4 5 6的进行查询

能不能取一个minfd和maxfd   比如只有 3 4在通信  那么取maxfd=5   minfd = 2   这样服务端就可以2 3 4 5, 2 3 4 5的进行查询入力出力了 ?

希望高手能帮忙解决下了,什么好感谢的了啊  所有的分都奉上了
搜索更多相关主题的帖子: 客户端 通信 服务端 
2012-07-14 00:28
xbubblex
Rank: 1
等 级:新手上路
帖 子:11
专家分:4
注 册:2012-7-13
收藏
得分:0 
最主要的是minfd 和 maxfd 可以根据什么来确定啊  
 
希望大家指点迷经啊
2012-07-14 00:59
xbubblex
Rank: 1
等 级:新手上路
帖 子:11
专家分:4
注 册:2012-7-13
收藏
得分:0 
不会大家都去睡觉去了吧  亲爱的斑竹啊 指点下秘境吧
2012-07-14 01:25
信箱有效
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1102
专家分:4268
注 册:2012-6-19
收藏
得分:10 
看不懂你在说什么,但是好象很厉害的样子。
这个用多线程最好了吧。
2012-07-14 04:04
xbubblex
Rank: 1
等 级:新手上路
帖 子:11
专家分:4
注 册:2012-7-13
收藏
得分:0 
大家早上好啊,还是没有结果啊
2012-07-14 09:47
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:10 
你这段代码写得逻辑方面基本上是这样,但是,有几个小地方需要修改。
1、对fd_set的理解。fd_set 其实就是一个集合体,而select中的maxSocket是自己管理的值,和fd_set没有任何关系,只要其大于fd_set中的每个值即可。
2、select结果必须大于0,才能进行socketID的判断操作;
3、socketID的管理需要代码本身管理(队列,链表皆可),和fd_set没有任何关系,也和maxSocket没有任何关系。代码中对socketID没有管理,而借用一个不相关的FD_SETSIZE,注定FD_ISSET会失败。
4、代码中对cli没有赋值;

你先修改,如果有什么问题,继续发帖。

2012-07-14 09:53
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:0 
maxfd是建立的最大的socketID + 1
另外,不建议用多线程,那样,会降低cpu的利用效率。
2012-07-14 09:54
快速回复:请问 select客户端服务器 通信的改进
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028280 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved