zoukankan      html  css  js  c++  java
  • 实现Linux select IO复用C/S服务器代码

    已在ubuntu 下验证可用

    服务器端

    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<string.h>
    #include<sys/socket.h>
    #include<sys/stat.h>
    #include<arpa/inet.h>
    #include <sys/select.h>


    #define MAXBUF 256
    #define MAXLISTEN 8
    #define PORT 8888


    struct msgtemp
    {
    int num;
    char *s;
    };

    int main()
    {
    int clen,dirnum,opt=1,i,nbyte;
    int listenfd,clientfd,maxfd;
    int client[FD_SETSIZE];

    struct sockaddr_in client_addr,server_addr;
    char readbuf[MAXBUF],writebuf[MAXBUF];
    struct msgtemp msg[FD_SETSIZE];
    fd_set rset, allset;

    if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0){
    perror("socket error:");
    exit(1);
    }
    clen = sizeof(client_addr);
    bzero(&server_addr,0);
    server_addr.sin_family =AF_INET;
    server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    server_addr.sin_port=htons(PORT);

    setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,(char*)&opt,sizeof(opt));
    if(bind(listenfd,(struct sockaddr *)&server_addr,sizeof(server_addr))<0){
    perror("bind error");
    exit(1);
    }
    if(listen(listenfd,MAXLISTEN)<0){
    perror("listen error:");
    exit(1);
    }

    maxfd = listenfd;
    for (i = 0; i < FD_SETSIZE; i++)
    client[i] = -1;

    FD_ZERO(&allset);
    FD_SET(listenfd, &allset);


    while(1){
    rset = allset;
    if(select(maxfd+1, &rset, NULL, NULL, NULL)<0)
    {
    perror("select");
    return -1;
    }
    if (FD_ISSET(listenfd, &rset)) { /* 是否有新的连接进来*/
    clientfd=accept(listenfd,(struct sockaddr *)&client_addr,&clen);
    if(clientfd < 0)
    {
    perror("accept");
    }
    printf("new connection fd = %d ",clientfd);
    FD_SET(clientfd, &allset);
    maxfd = clientfd > maxfd ? clientfd : maxfd;
    for (i = 0; i < FD_SETSIZE; i++)
    if (client[i] < 0) {
    client[i] = clientfd;
    break;
    }
    }
    for (i = 0; i < FD_SETSIZE; i++)
    {
    if (FD_ISSET(client[i], &rset)) {
    if ( (nbyte = read(client[i], readbuf, MAXBUF)) < 0) {
    perror("read");
    continue;

    }
    else if (nbyte ==0)
    {
    close(client[i]);
    FD_CLR(client[i], &allset);
    printf("connection fd = %d closed ",client[i]);
    client[i] = -1;
    msg[i].num =0;
    msg[i].s = NULL;

    }
    else{
    printf("recv msg from fd = %d : %s ",client[i],readbuf);

    msg[i].s = readbuf;
    sprintf(writebuf,"%03d : %s",msg[i].num,msg[i].s);
    write(client[i], writebuf, strlen(writebuf)+1);
    msg[i].num ++;
    }

    }
    }






    }
    return 0;
    }

    客户端

    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<string.h>
    #include<sys/socket.h>
    #include<sys/stat.h>
    #include<arpa/inet.h>
    #include<fcntl.h>

    #define MAXBUF 256
    #define PORT 8888

    int main()
    {
    int ssock;
    int clen,readbytes,fd2,i;
    struct sockaddr_in server_addr;
    char writebuf[MAXBUF],readbuf[MAXBUF],file_path[MAXBUF];

    if((ssock=socket(AF_INET,SOCK_STREAM,0))<0){
    perror("socket error:");
    exit(1);
    }
    clen = sizeof(server_addr);
    bzero(&server_addr,0);
    server_addr.sin_family =AF_INET;
    server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    server_addr.sin_port =htons(PORT);
    if(connect(ssock,(struct sockaddr *)&server_addr,clen)<0){
    perror("connect error:");
    exit(1);
    }



    while(1)
    {
    printf("input msg:");
    fgets(writebuf,MAXBUF,stdin);
    if(write(ssock,writebuf,MAXBUF)<0)
    {
    perror("write error:");
    }

    readbytes=read(ssock,readbuf,MAXBUF);
    if( readbytes <0 )
    {

    perror("read error:");
    exit(1);
    }
    if( readbytes ==0 )
    {
    printf("connection closed ");
    break;
    }


    printf("%s ",readbuf);
    }





    close(ssock);

    return 0;
    }

  • 相关阅读:
    【BZOJ4448】【SCOI2015】情报传递
    【BZOJ2006】【NOI2010】超级钢琴
    NOIp2018模拟赛四十五~??
    【BZOJ4940】【YNOI2016】这是我自己的发明
    数据迁移—datax
    DG模拟GAP手动处理
    DG问题:ORA-16416: No viable Physical Standby switchover targets available
    管理和维护DG
    DG问题
    DG概念与机制
  • 原文地址:https://www.cnblogs.com/chenglongxu/p/5578589.html
Copyright © 2011-2022 走看看