select实例

#include <cstdlib>
#include <sys/types.h>   
#include <sys/socket.h>   
#include <stdio.h>   
#include <netinet/in.h>   
#include <sys/time.h>   
#include <sys/ioctl.h>   
#include <unistd.h>   
  
int main()   
{   
    int server_sockfd, client_sockfd;   
    int server_len, client_len;   
    struct sockaddr_in server_address;   
    struct sockaddr_in client_address;   
    int result;   
    fd_set readfds, testfds;   
    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);//建立服务器端socket   
    server_address.sin_family = AF_INET;   
    server_address.sin_addr.s_addr = htonl(INADDR_ANY);   
    server_address.sin_port = htons(9734);   
    server_len = sizeof(server_address);   
    bind(server_sockfd, (struct sockaddr *)&server_address, server_len);   
    listen(server_sockfd, 5);   
    FD_ZERO(&readfds);   
    FD_SET(server_sockfd, &readfds);//将服务器端socket加入到集合中  
    while(1)   
    {  
        char ch;                  
        int fd;   
        int nread;   
        testfds = readfds;   
        printf("server waiting/n");   
  
        /*无限期阻塞,并测试文件描述符变动 */  
        result = select(FD_SETSIZE, &testfds, (fd_set *)0,(fd_set *)0, (struct timeval *) 0);   
        if(result < 1)   
        {   
            perror("server5");   
            exit(1);   
        }   
  
        /*扫描所有的文件描述符*/  
        for(fd = 0; fd < FD_SETSIZE; fd++)   
        {  
            /*找到相关文件描述符*/  
            if(FD_ISSET(fd,&testfds))   
            {   
                        /*判断是否为服务器套接字,是则表示为客户请求连接。*/  
                if(fd == server_sockfd)   
                {   
                    client_len = sizeof(client_address);   
                    client_sockfd = accept(server_sockfd,   
                    (struct sockaddr *)&client_address, (socklen_t *)&client_len);   
                    FD_SET(client_sockfd, &readfds);//将客户端socket加入到集合中  
                    printf("adding client on fd %d/n", client_sockfd);   
                }   
  
                /*客户端socket中有数据请求时*/  
                else   
                {                                            
                    ioctl(fd, FIONREAD, &nread);//取得数据量交给nread  
                      
                    /*客户数据请求完毕,关闭套接字,从集合中清除相应描述符 */  
                    if(nread == 0)   
                    {   
                        close(fd);   
                        FD_CLR(fd, &readfds);   
                        printf("removing client on fd %d/n", fd);   
                    }   
  
                    /*处理客户数据请求*/  
                    else   
                    {   
                    char buf[1024];
                        recv(fd, buf, sizeof(buf),0); 
                        printf(buf);
                    }   
                }   
            }   
        }   
    }   
}   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值