Linux poll

Linux poll


poll提供的功能与select类似,不过在处理流设备时,它能够提供额外的信息。

1、函数原型
  #include <poll.h>int poll(struct pollfd fd[], nfds_t nfds, int timeout);
2、函数参数:
(1)fd:一个结构数组,struct pollfd结构如下:
struct pollfd
{int fd;              //文件描述符short events;    //请求的事件short revents;   //返回的事件
};
  events和revents是通过对代表各种事件的标志进行逻辑或运算构建而成的。events包括要监视的事件,poll用已经发生的事件填充revents。poll函数通过在revents中设置标志肌肤POLLHUP、POLLERR和POLLNVAL来反映相关条件的存在。不需要在events中对于这些标志符相关的比特位进行设置。如果fd小于0, 则events字段被忽略,而revents被置为0.标准中没有说明如何处理文件结束。文件结束可以通过revents的标识符POLLHUN或返回0字节的常规读操作来传达。即使POLLIN或POLLRDNORM指出还有数据要读,POLLHUP也可能会被设置。因此,应该在错误检验之前处理正常的读操作。
poll函数的事件标志符值
常量 说明
POLLIN 普通或优先级带数据可读
POLLRDNORM 普通数据可读
POLLRDBAND 优先级带数据可读
POLLPRI 高优先级数据可读
POLLOUT 普通数据可写
POLLWRNORM 普通数据可写
POLLWRBAND 优先级带数据可写
POLLERR 发生错误
POLLHUP 发生挂起
POLLNVAL 描述字不是一个打开的文件
  注意:后三个只能作为描述字的返回结果存储在revents中,而不能作为测试条件用于events中。
(2)第二个参数nfds:要监视的描述符的数目。

(3)最后一个参数timeout:是一个用毫秒表示的时间,是指定poll在返回前没有接收事件时应该等待的时间。如果  它的值为-1,poll就永远都不会超时。如果整数值为32个比特,那么最大的超时周期大约是30分钟。 INFTIM:永远等待;0:立即返回,不阻塞进程;>0:等待指定毫秒数。

#ifndef _POLL_H_
#define _POLL_H_#include "wrap.h"
#include "client_list.h"
#include "server_queue.h"#define SERVER_PORT     6780
#define MAXLINE         100
#define OPEN_MAX        65535
#define TCP_FRAME_SIZE  1200typedef struct
{int sockfd;  // server socketint port;    // server portstruct sockaddr_in addr; // server addrint maxi;  // poll maxstruct pollfd event_list[OPEN_MAX]; // poll all event server_queue_t send_queue; // server send data queue to clientserver_queue_t recv_queue; // server recv data queue from clientpthread_t send_thread;pthread_t recv_thread;client_t *client;  // client list -- save all client info
} server_t;/* recv and send queue frame */
typedef struct
{int sockfd;  // client socketuint16_t length;char data[TCP_FRAME_SIZE];
} __packed tcp_frame_t;//==========================================================
server_t *SocketInit(void);#endif /* _POLL_H_ */
#include "poll.h"
#include "debug.h"static server_t *socket_init(void)
{int opt = 1, i;server_t *current;current = (server_t *)malloc(sizeof(server_t));current->port = SERVER_PORT;current->sockfd = Socket(AF_INET, SOCK_STREAM, 0);// SOL_SOCKET: port can same, ip notSetsockopt(current->sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));current->addr.sin_family = AF_INET;current->addr.sin_port = htons(current->port);current->addr.sin_addr.s_addr = INADDR_ANY;Bind(current->sockfd, (struct sockaddr *)¤t->addr, sizeof(current->addr));Listen(current->sockfd, MAXLINE);current->event_list[0].fd = current->sockfd;current->event_list[0].events = POLLIN;for(i = 1; i < OPEN_MAX; ++i){current->event_list[i].fd = -1;}current->maxi = current->sockfd;ServerQueueInit(&current->send_queue, TCP_FRAME_SIZE);ServerQueueInit(&current->recv_queue, TCP_FRAME_SIZE);return current;
}static void socket_accept(server_t *arg)
{server_t *current = arg;struct sockaddr_in addr;int len = sizeof(struct sockaddr_in), i;int new_fd = Accept(current->sockfd, (struct sockaddr *)&addr, &len);debug("new connection client_fd ( %d ) %s: %d\n", new_fd, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));for(i = 0; i < OPEN_MAX; ++i){if(current->event_list[i].fd < 0){// add new_fd to event_list current->event_list[i].fd = new_fd;current->event_list[i].events = POLLIN;break;}}if(OPEN_MAX == i){printf("too many connects\n");Close(new_fd);return;}if(i > current->maxi){current->maxi = i;}/* add client node */client_t *node = (client_t *)malloc(sizeof(client_t));node->sockfd = new_fd;memcpy(&node->addr, &addr, sizeof(struct sockaddr_in));ClientAdd(node);
}static void socket_recv(server_t *arg, int ret)
{server_t *current = arg;int i, sockfd, length = 0;tcp_frame_t write;for(i = 1; i <= current->maxi; ++i){if((sockfd = current->event_list[i].fd) < 0){continue;}if(current->event_list[i].revents & (POLLIN | POLLERR)){length = recv(sockfd, write.data, TCP_FRAME_SIZE, 0);if(0 == length){/* delete client node, close connect socket */debug("client[%d] close\n", sockfd);ClientDel(sockfd);Close(sockfd);continue;}else if(length > 0){write.sockfd = sockfd;write.length = length;server_debug(write.data, write.length);// add data to recv_queue, pop in other, if(ServerQueueWrite(&current->recv_queue, (uint8_t *)&write, sizeof(tcp_frame_t)) == 0){debug("push failure...queue full...\n");}}if(--ret <= 0){break;}}}
}static void *server_recv_thread(void *arg)
{server_t *current = (server_t *)arg;while(1){int timeout = 3000;int ret = Poll(current->event_list, current->maxi, timeout);if(current->event_list[0].revents & POLLIN){socket_accept(current); // a new connect come}if(--ret < 0){continue;}socket_recv(current, ret); // a exsit connect send data to us}Close(current->sockfd);return NULL;
}static void *server_send_thread(void *arg)
{server_t *current = (server_t *)arg;tcp_frame_t *read = NULL;while(1){//read = (tcp_frame_t*)ServerQueueRead(&current->send_queue, sizeof(tcp_frame_t));if(read != NULL){//server_debug(read->data, read->length);}usleep(100);}return NULL;
}server_t * SocketInit(void)
{server_t *current = socket_init();debug("create thread...\r\n");pthread_create(&current->send_thread, NULL, server_send_thread, current);pthread_create(&currentt->recv_thread, NULL, server_recv_thread, current);return current;
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL Server表分区-水平分区

SQL Server表分区&#xff0c;sql server水平分区 转自&#xff1a;http://www.cnblogs.com/knowledgesea/p/3696912.html 根据时间的&#xff0c;直接上T-SQL代码的水平分区&#xff1a;https://www.xuebuyuan.com/1817312.html?tdsourcetags_pcqq_aiomsg什么是表分区 一般情…

jQuery1.3.2 源码学习 -2 两个重要的正则表达式

32 // Is it a simple selector 33 isSimple /^.[^:#\[\.,]*$/ / / 表示这是正则表达式 ^ 表示开始部分 $ 表示结束部分 . 匹配除了 \n 之外的任何字符 [^character_group] 表示不在字符集合中 [^:#\[\.,] 表示除了冒号 (:), #, 前中括号([), 句号(.) 和逗号(,)之外的任何一个…

基于STC89C52的韦根数据接收

韦根是一种开放的通讯协议&#xff0c;具体官方介绍如下&#xff1a;Wiegand协议是国际上统一的标准&#xff0c;有很多格式&#xff0c;标准的26-bit 应该是最常用的格式。此外&#xff0c;还有34-bit 、37-bit 等格式。格式的含义如下&#xff1a;当给出这一串数字&#xff0…

头文件介绍

头文件介绍 axftmp1.h 是收集类模板(MFC模板类)的头文件&#xff0c;倘若你在程序中用到了CArray, CObList等数据结构时&#xff0c;那么就得加载该文件。通常在MFC编程中&#xff0c;为了使用集合、数组类&#xff0c;要在StdAfx.h中加入下面语句&#xff1a;#include <afx…

超乎想象,数据揭示自学成才的码农为何备受青睐

你是否想成为一个 Web 开发者&#xff0c;但却不知道从哪里开始&#xff1f; 你是否对学习编程语言的大量建议和繁琐细节感到审美疲劳&#xff1f; 你是否不确定需要遵循哪条路才能成为一个自信而又足智多谋的开发者&#xff1f; 如果你的回答是肯定的&#xff0c;那么不要担心…

Linux epoll

Linux epoll事件触发一、什么是epollepoll是什么&#xff1f;按照man手册的说法&#xff1a;是为处理大批量句柄而作了改进的poll。当然&#xff0c;这不是2.6内核才有的&#xff0c;它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linuxkernel 2.5.44)&…

Cisco 3层交换HSRP

现在3层交换机上:先把每一台交换机的vlan的ip配好在进入vlan (n)下在配<一>热备份的ip<二>配优先级(standby 加是第几组如1 priority 加优先级 如200)<三>占先权(standby 1 preempt)配置如下:假如你是vlan1ip routinginterface vlan 1standby 1 ip 192.168.1…

Linux下的图形库curses写贪吃蛇,酷

最近看到大神在Linux下写的贪吃蛇代码&#xff0c;用到了curses图形库&#xff0c;可能很多人都没有用过&#xff0c;分享出来给大家。在ubuntu下安装curses图形库命令sudo apt-get install libncurses5-dev双buff是一个非常优秀的机制&#xff0c;之前写贪吃蛇的时候&#xff…

BUG笔记

1.无法打开lib 你这个 error LNK1104是链接时的错误&#xff0c;应该是需要此库&#xff0c;没办法忽略 找到此库 并在Properties->Linker->Input->Additional Depenncidees里加入库名 在Properties->Linker->General->Additional Library Directories里加入…

STM32f103C8T6 bootloader设计

STM32 bootloader设计 使用的是STM32f103C8T6&#xff1a;64Kflash&#xff0c;在应用程序中通过CAN把接受到的bin写到外置 flash的指定地址处。在bootloader中判断一个单独的标志位看程序是否需要升级&#xff0c;如果需要升级&#xff0c;则复制外置flash处的内容到STM32的内…

初中变成了菜园子了!

我家在四川省射洪县天仙镇凤鸣场&#xff0c;属于四川盆地山区&#xff0c;在四川中部&#xff0c;发源于川北羌塘群山的涪&#xff08;fu&#xff09;江流经射洪县城。天仙镇原名天仙寺&#xff0c;附近很多乡镇都是奇怪的名字&#xff1a;大庙、双庙、佛照、玉贞观。我怀疑这…

单片机数字滤波算法如何实现?(附代码)

ID&#xff1a;技术让梦想更伟大整理&#xff1a;李肖遥单片机主要作用是控制外围的器件&#xff0c;并实现一定的通信和数据处理。但在某些特定场合&#xff0c;不可避免地要用到数学运算&#xff0c;尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机…

VS2010,C++ 制作静态库(*.lib),并使用

VS2010,C 制作静态库(*.lib)&#xff0c;并使用 原文链接&#xff1a;https://blog.csdn.net/qq_41472037/article/details/100001322 简单来说&#xff0c;就是建立两个项目:① Win32 Project &#xff08;Win32 项目&#xff09;&#xff1a; 接口文件.h 和 实现接口文件.cp…

STM32f103——ILI9341

STM32f103 —— ILI9341 #ifndef ILI9341_H_ #define ILI9341_H_#include "type.h"//TFT ILI9341 #define ILI9341_SPI SPI1#define ILI9341_MOSI_GRP GPIOA #define ILI9341_MOSI_IDX GPIO_Pin_7 #define ILI9341_MOSI_LOW() GPIO_ResetBits(ILI…

利用云计算打造政务信息化及应急指挥云平台

本文转载自星光云http://www.365yun.top/news/list.asp?newsid24云计算平台提供最全面的、集成度最高的开放平台&#xff0c;构建和管理面向运营、运维、用户服务的云数据中心管理平台&#xff1b;需集成计算、存储、网络、安全及管理&#xff0c;能够提供满足从基础设施到应用…

《网络规划设计师考试大纲》、《网络规划设计师教程》和《系统架构设计师教程》...

《网络规划设计师考试大纲》、《网络规划设计师教程》和《系统架构设计师教程》即将与广大考生见面2009年下半年即将开考的系统架构设计师和网络规划设计师两个科目&#xff0c;是自2005年上半年以来首次增加的计算机资格考试高级资格考试&#xff0c;即自2004年以来&#xff0…

项目实战,平均负载过高,最后发现却是这个搞鬼

1.前言最近在项目上遇到负载均衡过高的问题&#xff0c;分析好几天&#xff0c;还因此移植了一个CPU检测工具&#xff0c;后面在小二哥的指导找到了问题原因&#xff0c;小二哥有些读者应该会比较熟悉&#xff0c;之前发的微信滑动卡顿就是他分析的&#xff0c;他是一个非常厉害…

虚拟机压缩

virtualbox虚拟机运行久了之后就会发现&#xff0c;磁盘镜像vdi文件越来越大。即使你把虚拟机中的大文件删除&#xff0c;这个vdi文件占用的空间还是不变。也就是说动态扩展的vdi文件只会大&#xff0c;不会小。那么大的文件对于备份和分享都不是很方便&#xff0c;所以有必要的…

checkbox保存和赋值

//货物信息中的表格内容 $.each(trG.find(td input,td select),function(i,inp){if($(inp).attr(type)checkbox){if($(inp).is(:checked)){objG[$(inp).attr(name)]1;}else{objG[$(inp).attr(name)]0;}}else{objG[$(inp).attr(name)]$(inp).val();} }) $.each($(b).find(tr:las…

QT——QT4.8.5安装与配置

Qt4.8.5安装 1、安装包 mingw32-4.4.0.7z qt-creator-windows-opensource-2.8.0.exe qt-win-opensource-4.8.5-mingw.exe 2、安装步骤 &#xff08;1&#xff09;、首先安装qt creator,双击qt-creator-windows-opensource-2.8.0,注意安装目录不要有空格和特殊字符, 假设安装…