unix--网络编程IO复用

来源:互联网 发布:公安大数据分析研判 编辑:程序博客网 时间:2024/06/06 07:26

I/o复用问题:

 

#include #include #include #include #include #include #include #include #include #include #include #include #include #define PORT 34561#define  MAX 100const 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;imaxi)                maxi=i;            if(--nready<=0)                continue;        }        for(i=1;i0&&num

原创粉丝点击