1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <string.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <unistd.h>
  9. #include <sys/poll.h>
  10. #include <sys/time.h>
  11.  
  12. #define BUFSIZE 255
  13.  
  14. int rw_opt(int rdfd,int wdfd)
  15. {
  16. int num;
  17. char buf[BUFSIZE];
  18. memset(buf,,sizeof(buf));
  19. num = read(rdfd,buf,sizeof(buf));
  20. if(wdfd == )
  21. write(,">>>",);
  22. write(wdfd,buf,num);
  23. if(strncmp(buf,"quit",) == )
  24. return ;
  25. return num;
  26. }
  27.  
  28. int main()
  29. {
  30. int sockfd,ret;
  31. int acceptfd;
  32. struct sockaddr_in s_addr;
  33. sockfd = socket(AF_INET,SOCK_STREAM,);
  34. if(sockfd == -)
  35. {
  36. printf("socket error!\n");
  37. return ;
  38. }
  39.  
  40. memset(&s_addr,,sizeof(struct sockaddr_in));
  41. s_addr.sin_family = AF_INET;
  42. s_addr.sin_port = htons();
  43. s_addr.sin_addr.s_addr = htons(INADDR_ANY);
  44. ret = bind(sockfd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
  45. if(ret == -)
  46. {
  47. printf("bind error!\n");
  48. return ;
  49. }
  50.  
  51. ret = listen(sockfd,);
  52. if(ret == -)
  53. {
  54. printf("listen error!\n");
  55. return ;
  56. }
  57.  
  58. int addrlen = sizeof(struct sockaddr);
  59. acceptfd = accept(sockfd,(struct sockaddr *)&s_addr,&addrlen);
  60. if(acceptfd == -)
  61. {
  62. printf("accept error!\n");
  63. }
  64. else
  65. {
  66. printf("%s-----%d\n",inet_ntoa(s_addr.sin_addr),ntohs(s_addr.sin_port));
  67. }
  68.  
  69. struct pollfd fds[];
  70. fds[].fd=;
  71. fds[].fd=acceptfd;
  72. fds[].events=POLLIN|POLLOUT;
  73. fds[].events=POLLIN|POLLOUT;
  74. while()
  75. {
  76. ret=poll(fds, , -);
  77. if(ret<)
  78. {
  79. perror("poll");
  80. continue;
  81. }
  82. if(fds[].revents&POLLIN)
  83. {
  84. ret=rw_opt(, acceptfd);
  85. if(ret == )
  86. break;
  87. }
  88. if(fds[].revents&POLLIN)
  89. {
  90. ret=rw_opt(acceptfd, );
  91. if(ret == )
  92. break;
  93. }
  94. }
  95. close(acceptfd);
  96. close(sockfd);
  97. return ;
  98. }

ser.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <string.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>
  8. #include <unistd.h>
  9. #include <sys/poll.h>
  10. #include <sys/time.h>
  11.  
  12. #define BUFSIZE 255
  13.  
  14. int rw_opt(int rdfd,int wdfd)
  15. {
  16. int num;
  17. char buf[BUFSIZE];
  18. memset(buf,,sizeof(buf));
  19. num = read(rdfd,buf,sizeof(buf));
  20. if(wdfd == )
  21. write(,">>>",);
  22. write(wdfd,buf,num);
  23. if(strncmp(buf,"quit",) == )
  24. return ;
  25. return num;
  26. }
  27.  
  28. int main(int argc,char **argv)
  29. {
  30. int sockfd,ret;
  31. int acceptfd;
  32. struct sockaddr_in s_addr;
  33. sockfd = socket(AF_INET,SOCK_STREAM,);
  34. if(sockfd == -)
  35. {
  36. printf("socket error!\n");
  37. return ;
  38. }
  39.  
  40. memset(&s_addr,,sizeof(struct sockaddr_in));
  41. s_addr.sin_family = AF_INET;
  42. s_addr.sin_port = htons();
  43. s_addr.sin_addr.s_addr = inet_addr(argv[]);
  44. ret = connect(sockfd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
  45. if(ret == -)
  46. {
  47. printf("connect error!\n");
  48. return ;
  49. }
  50.  
  51. struct pollfd fds[];
  52. fds[].fd=;
  53. fds[].fd=sockfd;
  54. fds[].events=POLLIN|POLLOUT;
  55. fds[].events=POLLIN|POLLOUT;
  56.  
  57. while()
  58. {
  59. ret=poll(fds, , -);
  60. if(ret<)
  61. {
  62. perror("poll");
  63. continue;
  64. }
  65. if(fds[].revents&POLLIN)
  66. {
  67. ret=rw_opt(,sockfd);
  68. if(ret == )
  69. break;
  70. }
  71. if(fds[].revents&POLLIN)
  72. {
  73. ret=rw_opt(sockfd, );
  74. if(ret == )
  75. break;
  76. }
  77. }
  78. close(sockfd);
  79. return ;
  80. }

cli.c

socket网络编程-----I/O复用之poll函数的更多相关文章

  1. Linux网络编程——I/O复用之poll函数

    一.回顾前面的select select优点: 目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点 select缺点: 1.每次调用 select(),都需要把 fd 集合从用户态拷贝到内核 ...

  2. socket网络编程-----I/O复用之select函数

    #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/soc ...

  3. Linux网络编程——tcp并发服务器(poll实现)

    想详细彻底地了解poll或看懂下面的代码请参考<Linux网络编程——I/O复用之poll函数> 代码: #include <string.h> #include <st ...

  4. Socket网络编程--聊天程序(9)

    这一节应该是聊天程序的最后一节了,现在回顾我们的聊天程序,看起来还有很多功能没有实现,但是不管怎么说,都还是不错的.这一节我们将讲多服务器问题(高大上的说法就是负载问题了.)至于聊天程序的文件发送(也 ...

  5. Socket网络编程-IO各种概念及多路复用

    Socket网络编程-IO各种概念及多路复用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.操作系统相关知识 1>.同步和异步  函数或方法被调用的时候,调用者是否得到最 ...

  6. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  7. 项目总结——深入浅出socket网络编程

    前言: 为什么会有如题的概念呢,我想对于没有主动听说过socket网络编程的人来说读到题目可能就已经蒙头了,为了很好的让大家进入场景,首先说一下一个需要用到这点东西的业务需求. 首先大家应该明确的是s ...

  8. windows socket 网络编程

    样例代码就在我的博客中,包含六个UDP和TCP发送接受的cpp文件,一个基于MFC的局域网聊天小工具project,和此小工具的全部执行时库.资源和执行程序.代码的压缩包位置是http://www.b ...

  9. SOCKET网络编程细节问题1

    SOCKET网络编程快速上手(二)——细节问题(1) 三.细节问题一个也不能少 Socket编程说简单也简单,程序很容易就能跑起来,说麻烦还真是麻烦,程序动不动就出问题.记得刚开始写网络代码的时候,那 ...

随机推荐

  1. 使用XStream解析复杂XML并插入数据库(二)

    标注黄色地方:我需要加深学习!!! 我写的是webservice,目前具体写webservice的步骤我还不清楚, 整理完小知识开始整理webservice! 针对以下格式的XML进行解析 <? ...

  2. java既然存在gc线程,为什么还存在内存泄漏?

    java既然存在gc线程,为什么还存在内存泄漏? 1.既然 Java 的垃圾回收机制能够自动的回收内存,怎么还会出现内存泄漏的情况呢?这个问题,我们需要知道 GC 在什么时候回收内存对象,什么样的内存 ...

  3. myEclipse和eclipse从debug视图自动跳回default视图。

    本来是吐槽文,找到了解决的插件,就改改标题了. debug的时候,可以从default视图自动跳转到debug视图,退出debug的时候,却不能自动切换回default视图. https://bugs ...

  4. 【分享】JS如何为复制的Web文本添加其他信息

    看到了两篇关于这题的讨论,简单的记录一下!o(* ̄▽ ̄*)ブ 1.  stackoverflow , How to add extra info to copied web text 2.  黑客派, ...

  5. 配置python3

    1. 下载解压.$ wget https://www.python.org/ftp/python/3.4.1/Python-3.4.1.tgz$ tar zxvf Python-3.4.1.tgz 2 ...

  6. flex布局设置width无效

    子元素设置 : flex: 0 0 85px; 参数: flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto.后两个属性可选. 该属性有 ...

  7. Mac下如何配置环境变量JDK

    1.在英文输入法的状态下,按键盘“Ctrl + 空格”组合键,调出Spotlight搜索,在这里可以快速启动终端,输入ter,然后回车,即可打开终端: 2.如果你是第一次配置环境变量,可以使用“tou ...

  8. python2.x 与 python3.x的不同

    python2.x 与 python3.x 的区别: 1. python2.x 的源码编码不规范,源码重复较多:python3.x 的源码编码规范,清晰.优美.简单 2. python2.x的默认字符 ...

  9. learning coap protocol

    reference: http://coap.technology/spec.html

  10. mysql排序之ORDER BY IF、ORDER BY配合IN、TIMESTAMPDIFF、TIMESTAMPADD、FIELD

    1.order by if 排序 SELECT * FROM pet ORDER BY if (species='snake',0,1),species;--species为snake的行数放置到了查 ...