最近调试openwrt,发现低版本的ulibc不支持recv/send mmsg API,故简单写个实现一个测试程序,直接贴代码吧!,这里的程序可能兼容新版版本的ulibc出现问题,所以使用wrap_简单封装一下。

#define _GNU_SOURCE
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>#include <linux/unistd.h>
#include <unistd.h>/* Support recvmmsg/sendmmsg as uClib not support*/
#ifndef MSG_WAITFORONE
#define MSG_WAITFORONE  0x10000 /* recvmmsg(): block until 1+ packets avail */
#endifstruct mmsghdr {struct msghdr msg_hdr;unsigned    msg_len;
};static inline int recvmmsg(int fd, struct mmsghdr *mmsg,unsigned vlen, unsigned flags, struct timespec *timeout)
{return syscall(__NR_recvmmsg, fd, mmsg, vlen, flags, timeout);
}static inline int sendmmsg(int fd, struct mmsghdr *mmsg,unsigned vlen, unsigned flags)
{return syscall(__NR_sendmmsg, fd, mmsg, vlen, flags);
}int
main(void)
{
#define VLEN 10
#define BUFSIZE 200
#define TIMEOUT 3int sockfd, retval, i;struct sockaddr_in sa;struct mmsghdr msgs[VLEN];struct iovec iovecs[VLEN];char bufs[VLEN][BUFSIZE+1];struct timespec timeout;sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd == -1) {perror("socket()");exit(EXIT_FAILURE);}sa.sin_family = AF_INET;sa.sin_addr.s_addr = htonl(INADDR_ANY);sa.sin_port = htons(12345);if (bind(sockfd, (struct sockaddr *) &sa, sizeof(sa)) == -1) {perror("bind()");exit(EXIT_FAILURE);}LOOP:memset(msgs, 0, sizeof(msgs));for (i = 0; i < VLEN; i++) {iovecs[i].iov_base         = bufs[i];iovecs[i].iov_len          = BUFSIZE;msgs[i].msg_hdr.msg_iov    = &iovecs[i];msgs[i].msg_hdr.msg_iovlen = 1;}timeout.tv_sec = TIMEOUT;timeout.tv_nsec = 0;retval = recvmmsg(sockfd, msgs, VLEN, MSG_WAITFORONE, NULL);if (retval == -1) {perror("recvmmsg()");exit(EXIT_FAILURE);}printf("%d messages received\n", retval);for (i = 0; i < retval; i++) {bufs[i][msgs[i].msg_len] = 0;printf("%d %s", i+1, bufs[i]);}/* delay */for(i = 0; i < 10000000; i++)memset(msgs, 0, sizeof(msgs));goto LOOP;exit(EXIT_SUCCESS);
}

低版本ulibc支持recvmmsg sendmmsg功能相关推荐

  1. jQ进阶篇--jQuery封装placeholder效果,让低版本浏览器支持该效果

    页面中的输入框默认的提示文字一般使用placeholder属性就可以了,即: <input type="text" name="username" pla ...

  2. 低版本浏览器支持css3 Media查询的方法, ie6-ie8 不支持css3 的时候用respond.js,html5shiv.js 【非常实用哦】。。。。。。。。。。。。...

    Respond.js 是一个快速.轻量的 polyfill,用于为 IE6-8 以及其它不支持 CSS3 Media Queries 的浏览器提供媒体查询的 min-width 和 max-width ...

  3. es6语法在ios低版本的支持性

    let.const.箭头函数在ios的某些版本不支持,会引起报错 参考:https://blog.csdn.net/cx091/article/details/79805369 https://can ...

  4. HTML5 浏览器支持(怎么样让低版本浏览器支持html5?)

    你可以让一些较早的浏览器(不支持HTML5)支持 HTML5. 现代的浏览器都支持 HTML5. 此外,所有浏览器,包括旧的和最新的,对无法识别的元素会作为内联元素自动处理. 正因为如此,你可以 &q ...

  5. Hololens低版本不支持多通道或者单眼左眼显示问题

    原文链接 自己学习记录一下 第1篇. Multi-Pass VS Single-Pass-Instanced 1.1 Multi-Pass Multi-Pass,又称传统双通道模式.该模式是先完成左眼 ...

  6. 让低版本浏览器支持html5的标签

    原理就是首先用js的createElement来创建,之后在使用 document.createElement('header'); <header><hgroup>头部信息& ...

  7. 微信小程序、微信低版本兼容

    基础库低版本兼容 小程序的功能不断的增加,但是旧版本的微信客户端并不支持新功能,所以在使用这些新能力的时候需要做兼容. 1版本号比较 js_getuserinfo() {// 4 13// 2.10. ...

  8. 静默升级linux,Firefox 10 正式发布 支持静默升级功能

    Firefox 10 正式发布. 下载地址: 全新的界面.更易用的功能.更快的速度.更强的安全防护.更多的开发者工具...... 汇聚各种全新特性,给你更好的上网体验! 大幅提升的性能! 最新版的 F ...

  9. jQ1.5中的事件系统(低版本的事件系统)

    jQ的一个个版本事系统都在修正着bug和不断优化, 而且看了事件系统对事件的兼容更加熟悉, 更加了解jQ内部的事件机制. 因为jQ对事件系统引入了事件命名空间,事件的代理, 事件的手动触发,事件描述等 ...

最新文章

  1. 创业新力量缔造新未来,岳麓峰会再增“长沙势能”
  2. QT系统性总结(推荐新手看)
  3. gradle使用技巧之全局变量
  4. leetcode547. 朋友圈(并查集)
  5. FileLocker
  6. 这5款功能强大、堪称最良心的浏览器,简直好用极了!
  7. 计算机硬盘数据如何恢复,怎样进行硬盘数据恢复
  8. java 根据经纬度获取区域面积
  9. 伊斯坦布尔之旅返程:夜景和免税店
  10. 【唐诗分析器】实现思想代码+具体测试
  11. 【Shell 脚本速成】01、编程语言与 Shell 脚本介绍
  12. java怎么把背景设成纯透明,怎么把BufferedImage设置背景为透明
  13. 弗洛伊德算法——最短路径算法
  14. 又一个有创意的新东东: 基于手势的遥控棒
  15. 水工建筑物类毕业论文文献包含哪些?
  16. 玩自媒体短视频如何搬运
  17. 关于暂停博客评论的紧急公告!
  18. 微信网页获取用户授权-----LoveEmperor-王子様
  19. Golang,一道春天的闪电
  20. cisco交换机安装操作系统ios

热门文章

  1. hdu 4503 湫湫系列故事——植树节
  2. Golang之gjson
  3. NODE_PATH的疑难杂症(转)
  4. 文字处理的标签及属性
  5. nginx upstream setting
  6. dev控件中LookUpEdit的数据绑定问题
  7. Android 编译 SDK
  8. 只运行一个实例的方法
  9. 想写总结,却变成了胡诌。。。
  10. Golang 学习笔记资源