linux 多个select,Linux select()和多个套接字的FIFO排序?

您可以使用IP_PKTINFO获取数据包发送到的多播组的地址 - 即使套接字订阅了一堆多播组。有了这个,您将按顺序获取数据包并按组地址过滤。请参阅以下示例:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define PORT 1234

#define PPANIC(msg) perror(msg); exit(1);

#define STATS_PATCH 0

int main(int argc, char **argv)

{

fd_set master;

fd_set read_fds;

struct sockaddr_in serveraddr;

int sock;

int opt = 1;

size_t i;

int rc;

char *mcast_groups[] = {

"226.0.0.1",

"226.0.0.2",

NULL

};

#if STATS_PATCH

struct stat stat_buf;

#endif

struct ip_mreq imreq;

FD_ZERO(&master);

FD_ZERO(&read_fds);

rc = sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

if(rc == -1)

{

PPANIC("socket() failed");

}

rc = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

if(rc == -1)

{

PPANIC("setsockopt(reuse) failed");

}

memset(&serveraddr, 0, sizeof(serveraddr));

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(PORT);

serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);

rc = bind(sock, (struct sockaddr *)&serveraddr, sizeof(serveraddr));

if(rc == -1)

{

PPANIC("bind() failed");

}

rc = setsockopt(sock, IPPROTO_IP, IP_PKTINFO, &opt, sizeof(opt));

if(rc == -1)

{

PPANIC("setsockopt(IP_PKTINFO) failed");

}

for (i = 0; mcast_groups[i] != NULL; i++)

{

imreq.imr_multiaddr.s_addr = inet_addr(mcast_groups[i]);

imreq.imr_interface.s_addr = INADDR_ANY;

rc = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const void *)&imreq, sizeof(struct ip_mreq));

if (rc != 0)

{

PPANIC("joing mcast group failed");

}

}

FD_SET(sock, &master);

while(1)

{

read_fds = master;

rc = select(sock + 1, &read_fds, NULL, NULL, NULL);

if (rc == 0)

{

continue;

}

if(rc == -1)

{

PPANIC("select() failed");

}

if(FD_ISSET(sock, &read_fds))

{

char buf[1024];

int inb;

char ctrl_msg_buf[1024];

struct iovec iov[1];

iov[0].iov_base = buf;

iov[0].iov_len = 1024;

struct msghdr msg_hdr = {

.msg_iov = iov,

.msg_iovlen = 1,

.msg_name = NULL,

.msg_namelen = 0,

.msg_control = ctrl_msg_buf,

.msg_controllen = sizeof(ctrl_msg_buf),

};

struct cmsghdr *ctrl_msg_hdr;

inb = recvmsg(sock, &msg_hdr, 0);

if (inb < 0)

{

PPANIC("recvmsg() failed");

}

for (ctrl_msg_hdr = CMSG_FIRSTHDR(&msg_hdr); ctrl_msg_hdr != NULL; ctrl_msg_hdr = CMSG_NXTHDR(&msg_hdr, ctrl_msg_hdr))

{

if (ctrl_msg_hdr->cmsg_level == IPPROTO_IP && ctrl_msg_hdr->cmsg_type == IP_PKTINFO)

{

struct in_pktinfo *pckt_info = (struct in_pktinfo *)CMSG_DATA(ctrl_msg_hdr);

printf("got data for mcast group: %s\n", inet_ntoa(pckt_info->ipi_addr));

break;

}

}

printf("|");

for (i = 0; i < inb; i++)

printf("%c", isprint(buf[i])?buf[i]:'?');

printf("|\n");

#if STATS_PATCH

rc = fstat(sock, &stat_buf);

if (rc == -1)

{

perror("fstat() failed");

} else {

printf("st_atime: %d\n", stat_buf.st_atime);

printf("st_mtime: %d\n", stat_buf.st_mtime);

printf("st_ctime: %d\n", stat_buf.st_ctime);

}

#endif

}

}

return 0;

}下面的代码不会解决OP问题,但可能会指导人们处理类似的要求

(编辑)一个人不应该在深夜做这样的事情......即使有了这个解决方案,你也只能通过选择获得fd处理的订单 - 而且这不会给你关于帧到达时间的指示。

如here所述,目前无法检索套接字的顺序或它们更改的时间戳,因为没有为套接字inode设置所需的回调。但是,如果您能够修补内核,则可以通过在select系统调用中设置时间来解决此问题。

以下补丁可能会给你一个想法:

diff --git a/fs/select.c b/fs/select.c

index 467bb1c..3f2927e 100644

--- a/fs/select.c

+++ b/fs/select.c

@@ -435,6 +435,9 @@ int do_select(int n, fd_set_bits *fds, struct timespec *end_time)

for (i = 0; i < n; ++rinp, ++routp, ++rexp) {

unsigned long in, out, ex, all_bits, bit = 1, mask, j;

unsigned long res_in = 0, res_out = 0, res_ex = 0;

+ struct timeval tv;

+

+ do_gettimeofday(&tv);

in = *inp++; out = *outp++; ex = *exp++;

all_bits = in | out | ex;

@@ -452,6 +455,16 @@ int do_select(int n, fd_set_bits *fds, struct timespec *end_time)

f = fdget(i);

if (f.file) {

const struct file_operations *f_op;

+ struct kstat stat;

+

+ int ret;

+ u8 is_sock = 0;

+

+ ret = vfs_getattr(&f.file->f_path, &stat);

+ if(ret == 0 && S_ISSOCK(stat.mode)) {

+ is_sock = 1;

+ }

+

f_op = f.file->f_op;

mask = DEFAULT_POLLMASK;

if (f_op->poll) {

@@ -464,16 +477,22 @@ int do_select(int n, fd_set_bits *fds, struct timespec *end_time)

res_in |= bit;

retval++;

wait->_qproc = NULL;

+ if(is_sock && f.file->f_inode)

+ f.file->f_inode->i_ctime.tv_sec = tv.tv_sec;

}

if ((mask & POLLOUT_SET) && (out & bit)) {

res_out |= bit;

retval++;

wait->_qproc = NULL;

+ if(is_sock && f.file->f_inode)

+ f.file->f_inode->i_ctime.tv_sec = tv.tv_sec;

}

if ((mask & POLLEX_SET) && (ex & bit)) {

res_ex |= bit;

retval++;

wait->_qproc = NULL;

+ if(is_sock && f.file->f_inode)

+ f.file->f_inode->i_ctime.tv_sec = tv.tv_sec;

}

/* got something, stop busy polling */

if (retval) {笔记:

这是......仅适合你:) - 不要指望它在主线

在测试每个相关的fd之前调用

do_gettimeofday()。

为了获得更高的粒度,这应该在每次迭代中完成(并且仅在需要时)。因为stat-interface只提供一秒的粒度

你可以(!UGLY!)使用剩余的时间属性将秒的分数映射到那些字段。

这是使用内核3.16.0完成的,并没有经过充分测试。不要在太空船或医疗设备中使用它。如果您想尝试一下,请获取文件系统映像(例如https://people.debian.org/~aurel32/qemu/amd64/debian_wheezy_amd64_standard.qcow2)并使用qemu进行测试:

sudo qemu-system-x86_64 -kernel arch / x86 / boot / bzImage -hda debian_wheezy_amd64_standard.qcow2 -append“root = / dev / sda1”

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

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

相关文章

Python爬虫实战(5):模拟登录淘宝并获取所有订单(1)

经过多次尝试&#xff0c;模拟登录淘宝终于成功了&#xff0c;实在是不容易&#xff0c;淘宝的登录加密和验证太复杂了&#xff0c;煞费苦心&#xff0c;在此写出来和大家一起分享&#xff0c;希望大家支持。 本篇内容 1. python模拟登录淘宝网页 2. 获取登录用户的所有订单详情…

python逻辑流程图_python-程序流程图

原博文 2020-06-03 12:24 − 程序流程图 1、流程图的基本要素&#xff1a; 表示相应操作的框 带箭头的流程线 框内外必要的文字说明 起止框 判断...01055 相关推荐 2019-09-28 21:13 − Python python是一种跨平台的计算机程序设计语言&#xff0c;是一种面向对象的动态类型语言…

linux差分包升级流程,OTA 差分升级包的制作

OTA 升级是 Android 系统提供的标准软件升级方式。 它功能强大&#xff0c;提供了完全升级、增量升级模式&#xff0c;可以通过 SD卡升级&#xff0c;也可以通过网络升级。那如何生成差分升级包呢&#xff1f;Android源码的根目录下有以下两个命令&#xff1a;1、make ——会生…

jcenter那些事儿

jcenter是一个server托管在bintray.com的maven仓库。 in project’s build.gradle file allprojects { repositories { jcenter() } } 或者也能够用Maven Central&#xff1a;server托管在sonatype.org的maven仓库。allprojects { repositories { mavenCentral() } } 这…

vs2017python开发_VS2017作为python开发的IDE

在VS这一款号称“宇宙最强”的IDE和编译器中&#xff0c;高度集成了对python语言的支持&#xff0c;并直接加入了机器学习的框架&#xff0c;只需要在安装的时候选择python模块就行&#xff08;可以选择安装python2,、python3或者Anaconda&#xff09;。VS2017安装好之后就可以…

wps for linux alpha 15 语言包,WPS Office for Linux Alpah 7发布

WPS Office for Linux A7终于出来了&#xff0c;想当年做了一个ppt给老大发过去&#xff0c;后来发现没人能打开。。。先不看功能上的改进&#xff0c;光bug就修复了将近3千条&#xff0c;可见wps4linux团队的付出。版本摘要&#xff1a;增加et组建和主干同步至10月15日和v9分支…

50 个 Bootstrap 插件

Bootstrap是快速开发Web应用程序的前端工具包。它是一个CSS和HTML的集合&#xff0c;它使用了最新的浏览器技术&#xff0c;给你的Web开发提供了时尚的版式&#xff0c;表单&#xff0c;buttons&#xff0c;表格&#xff0c;网格系统等等。 本文向你推荐 50 个 Bootstrap 的插件…

linux shell sql赋值,Linux下shell执行SQL

mysql -P 端口号 -u用户名 -p密码 -e"use数据库名;待执行的sql语句;"取消用户密码有效期&#xff0c;关闭修改密码/usr/local/u-mail/service/mysql/bin/mysql -uumail -pcat /usr/local/u-mail/config/mysql_password.conf -e "use umail;update umail.core_ma…

python能和c语音交互吗_Python和C语言交互--ctypes,struct

python和c语言进行数据交互&#xff0c;涉及类型转换&#xff0c;字节对齐&#xff0c;字节序大小端转换等。相关模块ctypes&#xff0c;struct&#xff0c;memoryview。 一.ctypes:python和c语言使用结构体数据进行交互 场景&#xff1a;有一个C语言生成的动态链接库&#xff…

python3获取网页内容_python3获取一个网页特定内容

我们今天要爬取的网址为&#xff1a;https://www.zhiliti.com.cn/html/luoji/list7_1.html 一、目标&#xff1a;获取下图红色部分内容即获取所有的题目以及答案。 二、实现步骤。 分析&#xff1a; 1&#xff0c;首先查看该网站的结构。分析网页后可以得到&#xff1a; 我们需…

Linux64位steam,这下没得玩了! Steam无奈抛弃Linux用户

众所周知&#xff0c;Linux被公认为最安全的操作系统&#xff0c;近日&#xff0c;网络有消息传出Linux发行版Ubuntu确认将从今年下半年的19.10版本开始不再支持传统32位&#xff0c;而仅支持64位&#xff0c;而没有了32位系统的存在&#xff0c;许多游戏将不能支持。据了解&am…

解决问题:无法对 System程序集 添加Fakes程序集

为了在单元测试中指定DateTime.Now的值&#xff0c;我采用Microsoft Fakes技术的Shim。 主要参考了园里的http://www.cnblogs.com/FreeDong/p/3353111.html&#xff0c;编译时出了几千个警告&#xff0c;最终在“引用”中没有出现System.4.0.0.0.Fakes&#xff0c;当然了&#…

python抖音github_使用 Python 下载抖音无水印视频

抖音 APP 中保存到本地就是无水印版本的&#xff0c;所以头条的服务器肯定是保存有无水印版本的抖音视频的&#xff0c;所以只要找到接口地址就可以搞定。先在网上搜罗了一圈&#xff0c;确实有人已经做了解析&#xff0c;还提供了收费解析服务。 搜索之后发现又发现了同类型的…

linux 7 nano,Linux初學(CnetOS Linux7)之文本編輯器nano以及關機

1.nano文本編輯器[xiaohuilocalhost ~]$nano text.txt# 不管text.txt存不存在都沒有關系&#xff01;存在就開啟舊檔&#xff0c;不存在就開啟新檔GNU nano 2.3.1 File: text.txt<這個是游標所在處[ New File ]^G Get Help ^O WriteOut ^R Read File ^Y Prev Page ^K Cut Te…

grep 和 sed:linux经常使用工具 amp; 基本正則表達式

grep 见链接&#xff1a;http://www.cyberciti.biz/faq/grep-regular-expressions/ sed參考文章&#xff1a;http://www.thegeekstuff.com sed工作原理 This is called as one execution cycle. Cycle continues till end of file/input is reached&#xff1a; 1. Read a ent…

远程主机http协议版本信息泄漏_Web基础之http协议

Http协议介绍&#xfffc;HTTP 全称&#xff1a;Hyper Text Transfer Protocol 中文名&#xff1a;超文本传输协议什么是超文本包含有超链接(Link)和各种多媒体元素标记(Markup)的文本。这些超文本文件彼此链接&#xff0c;形成网状(Web)&#xff0c;因此又被称为网页(Web Page…

c语言opengles程序,OpenGL ES _ 着色器_程序

演示图你不知道这个东西&#xff0c;请不要看了,请看我的其他文章先了解一下O!学习目标掌握着色器程序的执行过程简单的例子uniform float t; // 时间uniform mat4 gl_ModelViewMatrix; // 模型视图矩阵attribute vec4 vel;const vec4 g vec4(0.0,-9.8,0.0) // 重力加速度void…

spring IOC加载流程

看了网上、书上很多对于spring IOC容器加载过程的分析。大多都只是粗略的讲一下加载流程。其实这样也不错&#xff0c;简单粗暴。清晰记得之前和一个前辈交流时他说的一句话&#xff1a;什么设计模式、设计框架都是扯淡&#xff0c;能实现这个功能就是最好的。其实这样的说法是…

pytorch 模型可视化_【深度学习】高效使用Pytorch的6个技巧:为你的训练Pipeline提供强大动力...

作者&#xff1a;Eugene Khvedchenya 编译&#xff1a;ronghuaiyang导读只报告模型的Top-1准确率往往是不够的。将train.py脚本转换为具有一些附加特性的强大pipeline每一个深度学习项目的最终目标都是为产品带来价值。当然&#xff0c;我们想要最好的模型。什么是“最好的”…

c语言 %-20s,一次 Rust 和C语言的混搭

存在内存泄露extern crate libc;use libc::size_t;use libc::{FILE,c_char};use std::string;#[repr(C)]pub struct mntent {mnt_fsname :*mut c_char, /* 挂载的文件系统的名字 */mnt_dir :*mut c_char, /* 挂载点 */mnt_type :*mut c_char, /* 文件系统类型&#xff1a;ufs、…