【发布时间】:2018-03-11 10:47:19
【问题描述】:
我有一个很简单的sn-p代码,试试看unix域socket是怎么工作的,我写了sender函数,还没有receiver函数,如下:
#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 自己打印的。我的程序哪里出错了?我用谷歌搜索了一段时间并检查了这个网站,没有找到好的线索。
如何解决?谢谢。
是的,应该添加 msghrd msg={0};初始化,问题解决!
【问题讨论】:
-
输出确实是由您的代码打印的,来自
ERR_EXIT宏及其对perror的使用。 -
为什么将返回值与 1 进行比较?没有有效的
errno集可以是-1以外的任何内容。 -
你忘了说代码需要用C++编译器编译。
-
@EugeneSh。可能是因为结构变量的定义没有
struct关键字。 -
@EugeneSh。您可能还应该写一个关于该比较的答案,因为它是 OP 问题的原因(因为
sendmsg返回发送的 bytes 数,而不是消息数)。跨度>