日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

低版本ulibc支持recvmmsg sendmmsg功能

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 低版本ulibc支持recvmmsg sendmmsg功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近調試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功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。