• poll函数


    • 端口复用,setsockopt函数
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
    

    //绑定name设备去发送消息

    setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, name, strlen(name))

    • poll函数
    int poll(struct pollfd *fds, nfds_t nfds, int timeout);
    
    • fds:是一个struct pollfd结构类型的数组,用于存放需要检测其状态的Socket描述符
    1. struct pollfd{
    2. int fd; //文件描述符
    3. short events; //等待的事件
    4. short revents; //实际发生的事件
    5. };
    typedef unsigned long int nfds_t;
    
    • timeout:是poll函数调用阻塞的时间,单位:毫秒;
    • 返回值:

      >0:数组fds中准备好读、写或出错状态的那些socket描述符的总数量;

      ==0:数组fds中没有任何socket描述符准备好读、写,或出错

      -1: poll函数调用失败,同时会自动设置全局变量errno;

    • events和revents的变量值

    • 从网上找的简单的例子

    1.通过open得到对应的fd , 也可通过socket之类的

    2.fd.events 设置这个fd需要关心的事件

    3.fd.revents 通过poll函数循环调用,看revents是否发生,比如发生POLLIN,表明收到了数据,于是可以用read从fd里去读数据

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #define MAX_BUFFER_SIZE 1024
    10. #define IN_FILES 3
    11. #define TIME_DELAY 60*5
    12. #define MAX(a,b) ((a>b)?(a):(b))
    13. int main()
    14. {
    15. struct pollfd fds[IN_FILES];
    16. char buf[MAX_BUFFER_SIZE];
    17. int i,res,real_read, maxfd;
    18. fds[0].fd = 0;
    19. if((fds[1].fd=open("data1",O_RDONLY|O_NONBLOCK)) < 0)
    20. {
    21. fprintf(stderr,"open data1 error:%s",strerror(errno));
    22. return 1;
    23. }
    24. if((fds[2].fd=open("data2",O_RDONLY|O_NONBLOCK)) < 0)
    25. {
    26. fprintf(stderr,"open data2 error:%s",strerror(errno));
    27. return 1;
    28. }
    29. for (i = 0; i < IN_FILES; i++)
    30. {
    31. fds[i].events = POLLIN;
    32. }
    33. while(fds[0].events || fds[1].events || fds[2].events)
    34. {
    35. if (poll(fds, IN_FILES, TIME_DELAY) <= 0)
    36. {
    37. printf("Poll error\n");
    38. return 1;
    39. }
    40. for (i = 0; i< IN_FILES; i++)
    41. {
    42. if (fds[i].revents)
    43. {
    44. memset(buf, 0, MAX_BUFFER_SIZE);
    45. real_read = read(fds[i].fd, buf, MAX_BUFFER_SIZE);
    46. if (real_read < 0)
    47. {
    48. if (errno != EAGAIN)
    49. {
    50. return 1;
    51. }
    52. }
    53. else if (!real_read)
    54. {
    55. close(fds[i].fd);
    56. fds[i].events = 0;
    57. }
    58. else
    59. {
    60. if (i == 0)
    61. {
    62. if ((buf[0] == 'q') || (buf[0] == 'Q'))
    63. {
    64. return 1;
    65. }
    66. }
    67. else
    68. {
    69. buf[real_read] = '\0';
    70. printf("%s", buf);
    71. }
    72. }
    73. }
    74. }
    75. }
    76. exit(0);
    77. }

  • 相关阅读:
    RDD的创建 - Python
    我的创作纪念日——2048天
    java中的线程中断
    线性表应用(非递减合并、分解链表、删除线性表)
    cmake练习一
    DataSource接口和一些扩展
    iOS 关于UIAlertController常见使用方法
    做亚马逊测评自养号 环境很重要 决定了你能做多长久
    【Dotnet 工具箱】推荐一个使用 C# 开发的轻量级压测工具
    滑板车出口欧盟要求提供给CE认证测试标准EN13613
  • 原文地址:https://blog.csdn.net/m0_37844072/article/details/126765415