select模型2

#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <strings.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <pthread.h>

void InitServerAddr(struct sockaddr_in* addr){
    bzero(addr,sizeof(struct sockaddr_in));
    addr->sin_addr.s_addr = inet_addr("127.0.0.1");
    addr->sin_family = AF_INET;
    addr->sin_port = htons(8888);
    addr->sin_len = sizeof(struct sockaddr_in);
}

#define prr_exit(x) do{perror(x);return -1;}while(0);

int main(void){
    int server_sockfd,client_sockfd;
    struct sockaddr_in server_addr;
    (void)InitServerAddr(&server_addr);

    if ((server_sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
        prr_exit("[create socket]");

    if (bind(server_sockfd,(struct sockaddr*)&server_addr,server_addr.sin_len) < 0)
        prr_exit("[bind]");

    listen(server_sockfd,20);

    fd_set readset,allset;
    FD_ZERO(&allset);
    FD_SET(server_sockfd,&allset);
    int fd_array[FD_SETSIZE],nready,nread;
    for (int i = 0; i < FD_SETSIZE; i++)
        fd_array[i] = -1;
    char buf[30];

    while(1){
        readset = allset;
        printf ("server waitting ready fd.\n");
        nready = select(FD_SETSIZE,&readset,NULL,NULL,NULL);
        if (nready < 0)
            prr_exit("[select]");
        
        if (FD_ISSET(server_sockfd,&readset)){
            client_sockfd = accept(server_sockfd,NULL,NULL);
            if (client_sockfd < 0)
                prr_exit("[accept]");
            FD_SET(client_sockfd,&allset);
            for (int i = 0; i < FD_SETSIZE; i++)
                if (fd_array[i] < 0){
                    fd_array[i] = client_sockfd;
                    break;
                }
            if (--nready == 0){//表示监听的一个套接字已经处理完成
                continue;
            }
        }

        for (int i = 0; i < FD_SETSIZE; i++){
            if (fd_array[i] < 0)//检测到有客户端在进行处理
                continue;
            if (FD_ISSET(fd_array[i],&readset)){
                bzero(buf,30);
                nread = read(fd_array[i],buf,30);
                if (nread == 0){
                    close(fd_array[i]);
                    FD_CLR(fd_array[i],&allset);
                    fd_array[i] = -1;
                }else if (nread > 0){
                    printf ("recv = %s\n",buf);
                }
                if (--nready == 0){
                    break;
                }
            }
        }
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搞个项目

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值