unix--网络编程IO复用

I/o复用问题:

 

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
             
               #include 
              
                #include 
               
                 #define PORT 34561 #define MAX 100 const char * end="quit\n"; void err_quit(const char *s) { puts(s); exit(0); } int Max(const int a,const int b) { return a>b?a:b; } void str_cli(const int con,FILE *fp) { char sen[MAX],rec[MAX]; int num,maxfd,nread,flag=0; fd_set rset; __DARWIN_FD_ZERO(&rset); memset(sen, 0, MAX); memset(rec, 0, MAX); while(1) { /* 在这里要考虑一个问题,当服务器发送一个EOF信号过来我们的处理是关闭 还有就是客户端发送信号时候我们也应该要考虑到的是关闭写操作 */ __DARWIN_FD_SET(con, &rset); __DARWIN_FD_SET(fileno(fp), &rset); maxfd=Max(fileno(fp), con)+1; nread=select(maxfd, &rset, NULL, NULL, NULL); if(nread==0) { if(errno!=EINPROGRESS) return -1; } if(__DARWIN_FD_ISSET(con, &rset)) { num=(int)recv(con, rec, MAX, 0); rec[num]='\0'; fprintf(stdout, "recviev from server %s\n",rec); if(num<=0||num>MAX){ if(flag==1) return; else err_quit("server is termianted"); } } if(__DARWIN_FD_ISSET(fileno(fp), &rset)) { if(fgets(sen,MAX,fp)==NULL) { flag=1; shutdown(fileno(fp), SHUT_WR); __DARWIN_FD_CLR(fileno(fp), &rset); continue; } printf("\n"); send(con, sen, MAX, 0); if(strcmp(end, sen)==0) err_quit("client is over!"); } } } void setInitialServer(struct sockaddr_in * server) { bzero(server, sizeof(*server)); server->sin_family=AF_INET; server->sin_port=htons(PORT); server->sin_addr.s_addr=inet_addr("127.0.0.1"); } int Connection(const int A,const struct sockaddr *server ,socklen_t size) { int con; con=connect(A, server, size); if(con==-1) err_quit("connection is error"); return con; } int main(int argc, const char * argv[]) { // insert code here... struct sockaddr_in server,client; int sockfd; socklen_t len=sizeof(client); sockfd=socket(AF_INET, SOCK_STREAM, 0); if(sockfd==-1) err_quit("socket error!"); setInitialServer(&server); Connection(sockfd, (struct sockaddr *)&server, len); str_cli(sockfd, stdin); close(sockfd); return 0; } 
                
               
              
             
            
           
          
         
       
      
      
     
     
    
    
   
   


select Server:

struct sockaddr_in server,clinet;
    Client cli[__DARWIN_FD_SETSIZE];
    fd_set rset,allset;
    char rea[MAX];
    int socked,num,conn,maxi,maxfd,i,nread,scok;
    socklen_t len=sizeof(clinet);
    bzero(&server, sizeof(server));
    memset(rea,0,MAX);
    server.sin_family=AF_INET;
    server.sin_port=htons(PORT);
    server.sin_addr.s_addr=htonl(INADDR_ANY);
    socked=socket(AF_INET, SOCK_STREAM, 0);
    if(socked==-1)
    {
        err_quit("socket error!");
    }
    if(bind(socked, (struct sockaddr*)&server, sizeof(server))==-1)
    {
        err_quit("bind error!");
    }
    if(listen(socked,LAN)==-1)
        err_quit("listen error");
    __DARWIN_FD_ZERO(&rset);
    __DARWIN_FD_ZERO(&allset);
    __DARWIN_FD_SET(socked, &allset);
    maxi=-1;
    maxfd=socked;
    for(i=0;i<__DARWIN_FD_SETSIZE;i++)
    {
        cli[i].fd=-1;
    }
    while(1)
    {
        rset=allset;
         nread=select(maxfd+1, &rset, NULL, NULL, NULL);
        if(nread==0)
        {
            if(errno!=EINPROGRESS)
                return -1;
        }
        if(__DARWIN_FD_ISSET(socked, &rset)){
       
        conn=accept(socked, (struct sockaddr *)&clinet, &len);
            if(conn<0)
            {
             if(errno==EINTR)
                 continue;
                else
                {
                    puts("error");
                    exit(0);
                }
            }
            for(i=0;i<__DARWIN_FD_SETSIZE;i++)
            if(cli[i].fd<0)
            {
                cli[i].fd=conn;
                cli[i].client=clinet;
                printf("the client's ip is %s,the id is %d\n",inet_ntoa(clinet.sin_addr),ntohs(clinet.sin_port));
                memset(cli[i].data, 0, MAX);
                break;
            }
            __DARWIN_FD_SET(conn, &allset);
            if(i>maxi)
                maxi=i;
            if(conn>maxfd)
                maxfd=conn;
            if(i==__DARWIN_FD_SETSIZE)
                err_quit("too many clients!");
            if(--nread<=0)
                continue;
        
        }
        for(i=0;i<=maxi;i++)
        {
            if((scok=cli[i].fd)<0)
                continue;
            if(__DARWIN_FD_ISSET(scok, &rset))
            {
                printf("test\n");
                if((num=(int)read(scok,rea,MAX))==0)
                {
                    close(scok);
                    printf("the client information %s\n",cli[i].data);
                    __DARWIN_FD_CLR(scok, &allset);
                    cli[i].fd=-1;
                }
                else
                    pro_str(cli[i], rea, MAX);
                if(--nread<=0)
                    break;
             }
        }
    }
    

poll server:

 /*
      struct pollfd{
       int fd;    描述字符
       short events;  调用值
       short revents; 返回值
      };

    */
    struct pollfd polls[OPEN_MAX];
    polls[0].events=POLLRDBAND;
    polls[0].fd=sockfd;
    for(i=1;i
   
   
    
    maxi)
                maxi=i;
            if(--nready<=0)
                continue;
        }
        for(i=1;i
    
    
     
     0&&num
     
     
    
    
   
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值