1. void str_cli(FILE *fp, int sockfd)
  2. {
  3. int maxfdp1, val, stdineof;
  4. ssize_t n, nwritten;
  5. fd_set rset, wset;
  6. char to[MAXLINE], fr[MAXLINE];
  7. char *toiptr, *tooptr, *friptr, *froptr;
  8.  
  9. val = fcntl(sockfd, F_GETFL, );
  10. fcntl(sockfd, F_SETFL, val | O_NONBLOCK);
  11.  
  12. val = fcntl(STDIN_FILENO, F_GETFL, );
  13. fcntl(STDIN_FILENO, F_SETFL, val | O_NONBLOCK);
  14.  
  15. val = fcntl(STDOUT_FILENO, F_GETFL, );
  16. fcntl(STDOUT_FILENO, F_SETFL, val | O_NONBLOCK);
  17.  
  18. toiptr = tooptr = to; /* initialize buffer pointers */
  19. friptr = froptr = fr;
  20. stdineof = ;
  21.  
  22. maxfdp1 = max(max(STDIN_FILENO, STDOUT_FILENO), sockfd) + ;
  23. for ( ; ; ) {
  24. FD_ZERO(&rset);
  25. FD_ZERO(&wset);
  26. if (stdineof == && toiptr < &to[MAXLINE])
  27. FD_SET(STDIN_FILENO, &rset); /* read from stdin */
  28. if (friptr < &fr[MAXLINE])
  29. FD_SET(sockfd, &rset); /* read from socket */
  30. if (tooptr != toiptr)
  31. FD_SET(sockfd, &wset); /* data to write to socket */
  32. if (froptr != friptr)
  33. FD_SET(STDOUT_FILENO, &wset); /* data to write to stdout */
  34.  
  35. select(maxfdp1, &rset, &wset, NULL, NULL);
  36.  
  37. if (FD_ISSET(STDIN_FILENO, &rset)) {
  38. if ( (n = read(STDIN_FILENO, toiptr, &to[MAXLINE] - toiptr)) < ) {
  39. if (errno != EWOULDBLOCK)
  40. err_sys("read error on stdin");
  41. } else if (n == ) {
    fprintf(stderr, "%s: EOF on stdin\n", gf_time());
  42. stdineof = ; /* all done with stdin */
  43. if (tooptr == toiptr)
  44. shutdown(sockfd, SHUT_WR); /* send FIN */
  45.        } else {
  46. fprintf(stderr, "%s: read %d bytes from stdin\n", gf_time(), n);
  47. toiptr += n; /* # just read */
  48. FD_SET(sockfd, &wset); /* try and write to socket below */
  49. }
  50. }
  51.  
  52. if (FD_ISSET(sockfd, &rset)) {
  53. if ( (n = read(sockfd, friptr, &fr[MAXLINE] - friptr)) < ) {
  54. if (errno != EWOULDBLOCK)
  55. err_sys("read error on socket");
  56.        } else if (n == ) {
  57. fprintf(stderr, "%s: EOF on socket\n", gf_time());
  58. if (stdineof)
  59. return; /* normal termination */
  60. else
  61. err_quit("str_cli: server terminated prematurely");
  62. } else {
  63. fprintf(stderr, "%s: read %d bytes from socket\n", gf_time(), n);
  64. friptr += n; /* # just read */
  65. FD_SET(STDOUT_FILENO, &wset); /* try and write below */
  66. }
  67. }
  68.  
  69. if (FD_ISSET(STDOUT_FILENO, &wset) && ( (n = friptr - froptr) > )) {
  70. if ( (nwritten = write(STDOUT_FILENO, froptr, n)) < ) {
  71. if (errno != EWOULDBLOCK)
  72. err_sys("write error to stdout");
  73.        } else {
  74. fprintf(stderr, "%s: wrote %d bytes to stdout\n", gf_time(), nwritten);
  75. froptr += nwritten; /* # just written */
  76. if (froptr == friptr)
  77. froptr = friptr = fr; /* back to beginning of buffer */
  78. }
  79. }
  80.  
  81. if (FD_ISSET(sockfd, &wset) && ( (n = toiptr - tooptr) > )) {
  82. if ( (nwritten = write(sockfd, tooptr, n)) < ) {
  83. if (errno != EWOULDBLOCK)
  84. err_sys("write error to socket");
  85. } else {
  86. fprintf(stderr, "%s: wrote %d bytes to socket\n", gf_time(), nwritten);
  87. tooptr += nwritten;      /* # just written */
  88. if (tooptr == toiptr) {
  89. toiptr = tooptr = to; /* back to beginning of buffer */
  90. if (stdineof)
  91. shutdown(sockfd, SHUT_WR); /* send FIN */
  92. }
  93. }
  94. }
  95. }
  96. }
  1. char *gf_time(void)
  2. {
  3. struct timeval tv;
  4. time_t t;
  5. static char str[];
  6. char *ptr;
  7.  
  8. if (gettimeofday(&tv, NULL) < )
  9. err_sys("gettimeofday error");
  10.  
  11. t = tv.tv_sec; /* POSIX says tv.tv_sec is time_t; some BSDs don't agree. */
  12. ptr = ctime(&t);
  13. strcpy(str, &ptr[]);
  14. /* Fri Sep 13 00:00:00 1986\n\0 */
  15. /* 0123456789012345678901234 5 */
  16. snprintf(str+, sizeof(str)-, ".%06ld", tv.tv_usec);
  17.  
  18. return(str);
  19. }

非阻塞读和写:str_cli函数的更多相关文章

  1. [PHP] stream_set_blocking非阻塞模式影响fgets fread函数

    当设置socket为非阻塞时,fread或者fgets函数会立即返回结果,而不需要等待有输入,测试过程可以使用vscode的debug模式来进行当不设置这一项时,如果客户端没有输入会一直阻塞在这里等待 ...

  2. 阻塞、非阻塞的概念和select函数的阻塞功能

    其它文档: http://www.cnitblog.com/zouzheng/archive/2010/11/25/71711.html (1)阻塞block     所谓阻塞方式block,顾名思义 ...

  3. 非阻塞式I/O

    套接字的默认状态是阻塞的.这就意味着当发出一个不能立即完成的套接字调用时,其进程将被投入睡眠,等待相应的操作完成.可能阻塞的套接字调用可分为以下4类 (1)输入操作,包括read,readv,recv ...

  4. NIO:异步非阻塞I/O,AIO,BIO

    Neety的基础使用及说明 https://www.cnblogs.com/rrong/p/9712847.html BIO(缺乏弹性伸缩能力,并发量小,容易出现内存溢出,出现宕机 每一个客户端对应一 ...

  5. 文件IO之——阻塞和非阻塞及perror函数

    读常规文件是不会阻塞的,不管读多少字节,read一定会在有限的时间内返回.从终端设备或网络读则不一定,如果从终端输入的数据没有换行符,调用read读终端设备就会阻塞,如果网络上没有接收到数据包,调用r ...

  6. recv send 阻塞和非阻塞

    http://blog.csdn.net/xiaofei0859/article/details/6037814 int send( SOCKET s, const char FAR *buf, in ...

  7. Tcp Socket非阻塞recv

    最近看了许多关于网络编程的资料,自己小记一下,以方便以后查找. 什么是阻塞socket,什么是非阻塞socket.对于这个问题,我们要先弄清什么是阻塞/非阻塞.阻塞与非阻塞是对一个文件描述符指定的文件 ...

  8. IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞的比较,recv参数对性能的影响—O_NONBLOCK(open使用)、IPC_NOWAIT(msgrcv)、MSG_DONTWAIT(re

    非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:       基本概念: 阻塞IO:: socket 的阻塞模式 ...

  9. linux下recv 、send阻塞、非阻塞区别和用法

    非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:       基本概念: 阻塞IO:: socket 的阻塞模式 ...

随机推荐

  1. Linux - 微软无线鼠标滚动过快问题

    Linux - 微软无线鼠标滚动过快问题 使用了一段时间的 Manjaro , 感觉相当不错, 但有一个蛋疼的地方就是每次滚动鼠标滚轮, 都会切换一页以上的页面, 总是有一部分看不到. 之前以为是 L ...

  2. 闲谈2-sat问题

    问题简介 在计算机科学中,布尔可满足性问题(有时称为命题可满足性问题,缩写为SATISFIABILITY或SAT)是确定是否存在满足给定布尔公式的解释的问题.换句话说,它询问给定布尔公式的变量是否可以 ...

  3. e2e测试框架之Cypress

    谈起web自动化测试,大家首先想到的是Selenium!随着近几年前端技术的发展,出现了不少前端测试框架,这些测试框架大多并不依赖于Selenium,这一点跟后端测试框架有很大不同,如Robot Fr ...

  4. 周末学习笔记——day03(模块,包)

    一,复习 ''' 装饰器 @wraper # fn = wraper(fn) def fn(): pass def wrap(arg): def outer(func): # 可以用arg def i ...

  5. (light oj 1102) Problem Makes Problem (组合数 + 乘法逆元)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1102 As I am fond of making easier problems, ...

  6. 软工+C(4): Alpha/Beta换人

    // 上一篇:超链接 // 下一篇:工具和结构化 注:在一次软件工程讨论课程进度设计的过程中,出现了这个关于 Alpha/Beta换人机制的讨论,这个机制在不同学校有不同的实施,本篇积累各方观点,持续 ...

  7. MySQL--7种join连接

    一,定义: 1)LEFT JOIN / LEFT OUTER JOIN:左外连接 左向外连接的结果集包括:LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行.如果左表的某行在右表 ...

  8. HTTP协议与TCP/IP协议

    OSI 是7层         TCP/IP 协议是 4层. OIS 包括的层 从底到上依次为 1.物理层 2.数据链路层 3.网络层 4.传输层 5.会话层 6.表示层 7.应用层 TCP/IP  ...

  9. MT 互联网 面试标准

    能力模型 业务理解(每项2分) java知识(每项2分) 网络知识(每项1分) 设计模式(每项3分) 数据库知识(每项2分) 框架知识(每项1分) 数据结构与算法(每项1分) 架构知识(每项3分) 操 ...

  10. Alan Turing的纪录片观后感

    清明假期,火车上闲着,上B站看了图灵的纪录片 好吧,感想就两个词,数字化 和 自动化