select在项目中应用代码实现

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>

#define SERV_PORT 6666
int main(int argc,char *argc[])
{
    int listenfd,connfd;
    char buf[BUFSIZE];

    struct sockaddr_in clie_addr,serv_addr;
    socklen_t clie_addr_len;

    listenfd=socket(AF_INET,SOCK_STREAM,0);

    int opt=1;
    setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));

    bzero(&serv_addr,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);
    bind(listenfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
    listen(listenfd,128);

    fd_set rset,allset;
    int ret,maxfd=0;
    maxfd=listenfd;
    FD_ZERO(&allset);
    FD_SET(listenfd,&allset);

    while(1)
    {
        rset=allset;
        ret=select(maxfd+1,&rset,NULL,NULL);
        if(ret<0)
        {
            perr_exit("select error");
        }
        if(FD_ISSET(listenfd,rset)){
            clie_addr_len=sizeof(clie_addr);
            connfd=accept(listenfd,(struct sockaddr*)&clie_addr,&clie_addr_len);

            FD_SET(connfd,&allset);
            if(maxfd<connfd)
            maxfd=connfd;
            if(ret==1)//说明select只返回一个,并且是listenfd,后续执行无需执行
            {
              continue;
            }
        }
        for(i = listenfd;i<maxfd+1;i++)
        {
            if(FD_ISSET(i,&rset)){
                n=read(i,buf,sizeof(buf));
                if(n==0){
                    close(i);
                    FD_CLR(i,&allset);
                }
                else if(n==-1)
                {
                    perr_exit("read error");
                }
                else{
                    for(int j=0;j<n;j++)
                    buf[j]=toupper(buf[j]);
                    write(i,buf,n);
                    write(STDOUT_FILENO,buf,n);
                }
            }
        }
    }
   close(listenfd);
   return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值