Unix域套接字错误,sendmsg:没有可用的缓冲区空间

时间:2017-09-29 13:56:31

标签: c linux sockets unix dns

我有一个非常简单的代码片段,试着知道unix域套接字是如何工作的,我写了发送器函数,还没有接收函数,就像下面这样:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <unistd.h>
#define ERR_EXIT(m) { \
        perror(m); \
        exit(EXIT_FAILURE); \
    }

void send_fd(int sock_fd, int number){
    iovec vec;
    vec.iov_base = &number;
    vec.iov_len = sizeof(number);

    msghdr msg;
    msg.msg_name = NULL;
    msg.msg_namelen = 0;
    msg.msg_iov = &vec;
    msg.msg_iovlen = 1;
    msg.msg_flags = 0;

    int ret = sendmsg(sock_fd, &msg, 0);
    if (ret != 1)
        ERR_EXIT("sendmsg");
}

int main(void){
    int sockfds[2];
    if (socketpair(PF_UNIX, SOCK_STREAM, 0, sockfds) < 0)
        ERR_EXIT("socketpair");
    send_fd(sockfds[1], 20);
    return 0;
}

在linux上编译并运行它,打印出来:

sendmsg: No buffer space available

好吧,我自己没有打印这条消息,猜测它是由sendmsg本身打印的。我的程序在哪里出错了?我已经google了一段时间并检查了这个网站,没有找到好的线索。

如何解决?感谢。

是的,应该补充一下 msghrd msg = {0};初始化,问题解决了!

1 个答案:

答案 0 :(得分:1)

你需要在msghdr初始化之后添加一个memset:

msghdr msg;
memset(&msg, 0, sizeof(msg));

问题是C(和C ++中的局部变量,除非它们有构造函数)没有初始化。您只初始化了一些字段,但不是全部。结果是其他一些人(我怀疑msg_control)中有垃圾,导致你目睹的错误。

除了这个问题,其他人在评论中说的也是如此。错误代码为-1(或更好,<0)。