ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用/dev/poll的str_cli函数

2019-04-24 19:48:05  阅读:199  来源: 互联网

标签:int dopoll dev stdineof pollfd str sockfd poll buf


void str_cli(FILE *fp, int sockfd)
{
    int        stdineof;
    char       buf[MAXLINE];
    int        n;
    int        wfd;
    struct pollfd    pollfd[2];
    struct dvpoll    dopoll;
    int        i;
    int        result;

    wfd = open("/dev/poll", O_RDWR, 0);

    pollfd[0].fd = fileno(fp);
    pollfd[0].events = POLLIN;
    pollfd[0].revents = 0;

    pollfd[1].fd = sockfd;
    pollfd[1].events = POLLIN;
    pollfd[1].revents = 0;

    write(wfd, pollfd, sizeof(struct pollfd) * 2);

    stdineof = 0;
    for ( ; ; ) {
        /* block until /dev/poll says something is ready */
        dopoll.dp_timeout = -1;
        dopoll.dp_nfds = 2;
        dopoll.dp_fds = pollfd;
        result = ioctl(wfd, DP_POLL, &dopoll);

        /* loop through ready file descriptors */
        for (i = 0; i < result; i++) {
            if (dopoll.dp_fds[i].fd == sockfd) {
                /* socket is readable */
                if ( (n = read(sockfd, buf, MAXLINE)) == 0) {
                    if (stdineof == 1)
                        return;        /* normal termination */
                    else
                        err_quit("str_cli: server terminated prematurely");
                }

                write(fileno(stdout), buf, n);
            } else {
                /* input is readable */
                if ( (n = read(fileno(fp), buf, MAXLINE)) == 0) {
                    stdineof = 1;
                    shutdown(sockfd, SHUT_WR);    /* send FIN */
                    continue;
                }

                writen(sockfd, buf, n);
            }
        }
    }
}

 

标签:int,dopoll,dev,stdineof,pollfd,str,sockfd,poll,buf
来源: https://www.cnblogs.com/soldierback/p/10764522.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有