我有一个非常简单的代码片段,试着知道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};初始化,问题解决了!
答案 0 :(得分:1)
你需要在msghdr初始化之后添加一个memset:
msghdr msg;
memset(&msg, 0, sizeof(msg));
问题是C(和C ++中的局部变量,除非它们有构造函数)没有初始化。您只初始化了一些字段,但不是全部。结果是其他一些人(我怀疑msg_control
)中有垃圾,导致你目睹的错误。
除了这个问题,其他人在评论中说的也是如此。错误代码为-1(或更好,<0
)。