周梦康 发表于 2015-11-14 3437 次浏览

socket服务器中使用select模型,通过设置timeval参数为NULL则一直阻塞,然后当有一个连接请求到服务器上时,listenfd就立即变为有内容可读了,那么在接受到请求的时候,listenfd里面到底写入了什么呢?

代码实例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <string.h>
  
#define SERV_PORT         8031
#define BACKLOG	          10


 
int main(void)
{
    int fd_ready_num;               // select返回的准备好的描述符个数     
    int listenfd, connectfd, maxfd;   
    struct sockaddr_in serv_addr;
    fd_set read_set, allset;
  
    if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)  
    {                           
        perror("套接字描述符创建失败");  
        exit(1);  
    }

    printf("listenfd :%d\n", listenfd);
    
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(SERV_PORT);
     
    if(bind(listenfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
    {
        perror("绑定失败");
        exit(1);
    }
      
    if(listen(listenfd, BACKLOG) == -1)
    {
        perror("监听失败");
        exit(1);
    }

    maxfd = listenfd + 1;

    FD_ZERO(&allset);
    FD_SET(listenfd,&allset);
 
    while(1){
        struct sockaddr_in addr;  
        read_set = allset;
        fd_ready_num = select(maxfd, &read_set, NULL, NULL, NULL);
        printf("有 %d 个文件描述符准备好了\n", fd_ready_num);

        for (int i = 0; i < maxfd; ++i)
        {
            if (FD_ISSET(i,&read_set))
            {
                printf("fd %d\n",i);
            }
        }
    }
 
    close(listenfd);
     
    return 0;
}

运行结果:

[zhoumengkang@localhost unix]$ ./a.out 
listenfd :3
...这里一直阻塞,直到有一个请求过来
有 1 个文件描述符准备好了
fd 3
...
^C
[zhoumengkang@localhost unix]$


👇 下面是我的公众号,高质量的博文我会第一时间同步到公众号,给个关注吧!

评论列表