2012年(12)
分类: LINUX
2012-04-19 11:37:42
1、listen_fd = socket();
2、配置服务器IP;
3、Bind(listen_fd , (SA *)&server, sizeof(serveradr)); 绑定本机与服务器;
4、设置监听客户端个数: listen(listen_fd, 10);
5、初始化一个Pollfd 类型的结构体数组用于保存client里生成的文件描述符的操作;
6、把数组中第一个元素设置为监听描述符: client[0].fd = listen_fd;
7、把测试条件设置为数据可读: client[0].events = POLLIN;
8、把数组中其他文件描述符设置为不可用,一般复位 -1;遍历赋值;
9、初始化一个最大文件描述符max_fd为0,用于遍历条件;
10、循环接受并发请求,开启while死循环;
11、调用poll(client, max _fd + 1, -1 ) //将进程阻塞,并保存有客户时的客户数;
12、判断client[0]的事件返回是否为POLLIN数据
13、如果是表示将有新的连接进来,已经被监听到。
处理:
1、调用connect_fd = accept()函数建立连接,
2、遍历client数组查找一个可用的文件描述符保存connect_fd;
3、如果没有空间了,表示已经满了,通知不能再处理客户请求;
4、由于生成文件描述符是当前可用最小的,故需要处理最大文件描述符 if(i > max ) max_fd = i;
5、判断监听客户返回数是否正确,如果-1之后不大于0,则表示监听失
败,直接返回到11步骤;
14、如果不是表示是已有的连接请求,那么根据客户请求文件描述符,做相应处理;
处理:
1、分析现有的文件描述符集(数组client)注意从1开始遍历到max_fd;
2、各种if判断读fd / 写fd / ......
3、分析客户返回数-1之后是否仍不小于0,否则直接返回、调出遍历条 件;
15、循环结束;