ICode9

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

使用kqueue的str_cli函数

2019-04-24 20:52:47  阅读:262  来源: 互联网

标签:fp kqueue EV cli ts str sockfd kev NULL


void str_cli(FILE *fp, int sockfd)
{
    int              kq, i, n, nev, stdineof = 0, isfile;
    char             buf[MAXLINE];
    struct kevent    kev[2];
    struct timespec  ts;
    struct stat      st;

    isfile = ((fstat(fileno(fp), &st) == 0) &&
              (st.st_mode & S_IFMT) == S_IFREG);

    EV_SET(&kev[0], fileno(fp), EVFILT_READ, EV_ADD, 0, 0, NULL);
    EV_SET(&kev[1], sockfd, EVFILT_READ, EV_ADD, 0, 0, NULL);

    kq = kqueue();
    ts.tv_sec = ts.tv_nsec = 0;
    kevent(kq, kev, 2, NULL, 0, &ts);

    for ( ; ; ) {
        nev = kevent(kq, NULL, 0, kev, 2, NULL);

        for (i = 0; i < nev; i++) {
            if (kev[i].ident == 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);
            }

            if (kev[i].ident == fileno(fp)) {    /* input is readable */
                n = read(fileno(fp), buf, MAXLINE);
                if (n > 0)
                    writen(sockfd, buf, n);

                if (n == 0 || (isfile && n == kev[i].data)) {
                    stdineof = 1;
                    shutdown(sockfd, SHUT_WR);    /* send FIN */
                    kev[i].flags = EV_DELETE;
                    kevent(kq, &kev[i], 1, NULL, 0, &ts);    /* remove kevent */
                    continue;
                }
            }
        }
    }
}

 

标签:fp,kqueue,EV,cli,ts,str,sockfd,kev,NULL
来源: https://www.cnblogs.com/soldierback/p/10764828.html

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

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

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

ICode9版权所有