基于poll实现的echo服务器(poll函数的用法)

来源:互联网 发布:软件系统开发计划 编辑:程序博客网 时间:2024/05/20 23:37
/*poll实现的echo服务器.Author:thinkmay*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <poll.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <sys/types.h>#include <errno.h>#define OPEN_MAX 512#define BUFSIZE 1024int main(int argc, char **argv){    //判断运行格式是否正确    if(argc != 2)    {        printf("usage: ./poll <port>");        exit(-1);    }    int listensock, connsock;    struct sockaddr_in servaddr;    struct pollfd fds[OPEN_MAX];//定义pollfd结构体    int i, count = 0, ready, reval;    char readbuf[BUFSIZE];    //首先对pollfd结构数组的fd都赋值为-1    for(i = 0; i < OPEN_MAX; i++)    {        fds[i].fd = -1;//循环将fd赋值为-1.    }        //创建TCP套接字    if((listensock = socket(AF_INET, SOCK_STREAM, 0)) < 0)    {        perror("socket error");        exit(-1);    }    memset(&servaddr, 0, sizeof(servaddr));//套接字地址变量清0    servaddr.sin_family = AF_INET;    servaddr.sin_family = htonl(INADDR_ANY);    servaddr.sin_port = htons(atoi(argv[1]));        //绑字套接字和套接字地址变量    if( bind(listensock, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)    {        perror("bind error");        exit(-1);    }        //监听套接字    if(listen(listensock, 5) < 0)    {        perror("listen error");        exit(-1);    }        //将0和listensock加入到pollfd结构体中    fds[0].fd = 0; //将标准输入添加到fd中    fds[0].events = POLLIN;//指明触发事件状态    count++;    fds[1].fd = listensock;    fds[1].events = POLLIN;    count++;    for(;;)    {        memset(readbuf, 0, BUFSIZE);        ready = poll(fds, count, 0);//定义poll准备        for(i = 0; i < count; i++)        {            //revents返回触发状态            if(fds[i].revents & POLLIN)//判断POLLIN是否触发            {                    if(fds[i].fd == 0)                    {                        fgets(readbuf, BUFSIZE, stdin);                        printf("read buf:%s\n", readbuf);                    }                    else if(fds[i].fd == listensock)                    {                        connsock = accept(listensock, NULL, NULL);                        printf("client connect\n");                        fds[count].fd = connsock;                        fds[count].events = POLLIN;                        count++;                    }                    else                    {                        reval = recv(fds[i].fd, readbuf, BUFSIZE, 0);                        printf("recv buf:%s\n", readbuf);                        send(fds[i].fd, readbuf, reval, 0);                    }            }        }        }    return 0;}

原创粉丝点击