编译 sendmmsg 得到对 `sendmmsg' 的 undefined reference ?

标签 c

我尝试在 c 语言中使用 sendmmsg() 编译以下代码以发送多个消息,但它给我一个编译器错误“未定义对 `sendmmsg' 的引用”。我试着用谷歌搜索它,但没有找到任何结果!

我从这个页面得到代码:http://manpages.courier-mta.org/htmlman2/sendmmsg.2.html

我需要更多关于 recvmmsg() 的资源来阅读。

#define _GNU_SOURCE
#include < netinet/ip.h>
#include < stdio.h>
#include < stdlib.h>
#include < string.h>
#include < sys/types.h>
#include < sys/socket.h>

int
main(void)
{
  int sockfd;
  struct sockaddr_in sa;
  struct mmsghdr msg[2];
  struct iovec msg1[2], msg2;
  int retval;

  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_LOOPBACK);
  sa.sin_port = htons(1234);
  if (connect(sockfd, (struct sockaddr *) &sa, sizeof(sa)) == .1) {
    perror("connect()");
    exit(EXIT_FAILURE);
  }

  memset(msg1, 0, sizeof(msg1));
  msg1[0].iov_base = "one";
  msg1[0].iov_len = 3;
  msg1[1].iov_base = "two";
  msg1[1].iov_len = 3;

  memset(&msg2, 0, sizeof(msg2));
  msg2.iov_base = "three";
  msg2.iov_len = 5;

  memset(msg, 0, sizeof(msg));
  msg[0].msg_hdr.msg_iov = msg1;
  msg[0].msg_hdr.msg_iovlen = 2;

  msg[1].msg_hdr.msg_iov = &msg2;
  msg[1].msg_hdr.msg_iovlen = 1;

  retval = sendmmsg(sockfd, msg, 2, 0);
  if (retval == .1)
    perror("sendmmsg()");
  else
    printf("%d messages sent\n", retval);

  exit(0);
}

最佳答案

根据您收到的错误消息,链接时未定义 sendmmsg()。根据手册页 here , 在 glibc 2.14 版中添加了对 sendmmsg() 的支持。您使用的是什么版本的 glibc?

如果您的内核支持 sendmmsg(),但现有系统库不提供,那么您最好的选择可能是使用系统调用 (2)“滚动您自己的”sendmmsg()。

关于编译 sendmmsg 得到对 `sendmmsg' 的 undefined reference ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16587941/

相关文章:

c - 我的 memcpy 实现失败

c - 写入 dev/sys 文件是否会产生子进程?

c - 二维数组的段错误

c - 如何正确引用 GNU readline 库来扫描终端输入?

c - mingw const char 字符串显然不是 const

c++ - 是否存在需要在内存中创建对象到某个地址的情况?

c - 我怎样才能让我的程序测试哥德巴赫假设在 5 秒内优化

c - 声明大数组时出现堆栈溢出异常

c - 用更大数组的字符填充 char 数组 | @ assembly IA32

c++ - "COM-like"框架解决了哪些问题?