免费注册 查看新帖 |

Chinaunix

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

unix网络编程 select [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-09 17:58 |只看该作者 |倒序浏览

                这个月打算把unix网络编程全部看一遍
               
               
                /*
* file name: selects.c
* date:      2008/11/8
* name:      zhou
*
*/
#include stdio.h>
#include stdlib.h>
#include string.h>
#include unistd.h>
#include sys/select.h>
#include sys/types.h>
#include sys/socket.h>
#include arpa/inet.h>
#define SA struct sockaddr
#define MAXCLI 10
#define LISMAX 5
#define MAXBUF 1024
int main(void)
{
    int   i, imax, maxfd, nready;
    int   lisfd, confd;
    int   clients[MAXCLI];
    char  readbuf[MAXBUF];
    struct sockaddr_in   seraddr;
    fd_set  rset, allset;
/* -----------------------初始化socket ---------------------------------- */
    if ((lisfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket error");
        return 1;
    }
   
    bzero(&seraddr, sizeof(seraddr));
    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(8899);
    seraddr.sin_addr.s_addr = htonl(INADDR_ANY);
    if (bind(lisfd, (SA *)&seraddr, sizeof(seraddr)) == -1) {
        perror("bind error");
        return 1;
    }
    if (listen(lisfd, LISMAX) == -1) {
        perror("listen error");
        return 1;
    }
    // 初始化各变量
    for (i = 0; i  MAXCLI; i++) {
        clients = -1;
    }
    imax = -1;
    maxfd = lisfd;
    FD_ZERO(&rset);
    FD_ZERO(&allset);  //忘记初始化
    FD_SET(lisfd, &allset);
/* ---------------------------------------------------------------------- */
    for ( ; ; ) {
        rset = allset;
        if ((nready = select(maxfd + 1, &rset, NULL, NULL, NULL)) == -1) {
            perror("select error");
            return 1;
        }
        if (FD_ISSET(lisfd, &rset)) {  /* new connect */
            if ((confd = accept(lisfd, NULL, NULL)) == -1) {
                perror("accept error");
                return 1;
            }
            for (i = 0; i  MAXCLI; i++) {
                if (clients == -1) {
                    clients = confd;
                    break;
                }
            }
            if (i == MAXCLI) {
                fprintf(stderr, "Too many connect\n");
            }
            if (i > imax) {
                imax = i;
            }
            if (confd > maxfd) {
                maxfd = confd;
            }
            FD_SET(confd, &allset);
            
            if (--nready = 0) {  //执行一个操作才减
                continue;
            }
        }
        
        int  n;
        for (i = 0; i = imax; i++) {
            if (clients == -1) {
                continue;
            }
            if (FD_ISSET(clients, &rset)) {
                if ((n = read(clients, readbuf, sizeof(readbuf))) == 0) {
                    close(clients);
                    FD_CLR(clients, &allset);
                    clients = -1;   //跟上一行交换了位置 结果FD_CLR老是段错误
                }
                //fprintf(stderr, "%s", readbuf);
                write(clients, readbuf, n);
            }
            if (--nready = 0)
                break;
        }
    }
}
遇到的错误:
  1.   close(clients);
                              FD_CLR(clients, &allset);
                               clients = -1;   //跟上一行交换了位置 结果FD_CLR老是段错误
                              2.  allset未初始化   select 返回数目老是不对
IO复用 select 函数
#include
#include
int select (int maxfd, fd_set *readset, fd_set *writeset,
                fd_set *exceptset, const struct timeval *timeout);
返回:就绪描述字的正数目, 0 超时 -1  出错
void FD_ZERO(fd_set  *fdset);   描述符集使用前必须初始化 未初始化select返回就绪的数目就不对
                                                        查了好半天
void FD_SET(int  fd, fd_set *fdset);
void FD_CLR(int  fd, fd_set  *fdset);
int  FD_ISSET(int fd, fd_set *fdset);
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/68452/showart_1389193.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP