msgdr的sys / socket缺少成员:msg_control,msg_controllen,msg_flags

问题描述 投票:0回答:2

我正在尝试使用UNIX DOMAIN SOCKETS编写一个小型客户端 - 服务器应用程序。

我正在使用msghdr作为sendmsg / recvmsg,但是当我编译以下代码时,它给出了以下错误:

include <sys/socket.h>
...
struct msghdr mh;
struct cmsghdr *cmp;
union{
    struct cmsghdr cm;
    char ctrl[sizeof(struct cmsghdr) + sizeof(int)];
} ctrlu;
...
mh.msg_name = NULL;
mh.msg_namelen = 0;
mh.msg_iov = iov;
mh.msg_iovlen = 1;
mh.msg_control = ctrlu.ctrl;
mh.msg_controllen = sizeof(ctrlu);
mh.msg_flags = 0;

错误信息:

gcc s.c -o s -lsocket

s.c:在函数`main'中:

s.c:59:错误:结构没有名为`msg_control'的成员

s.c:60:错误:结构没有名为`msg_controllen'的成员

s.c:61:错误:结构没有名为`msg_flags'的成员

*错误代码1

c sockets c89 unix-socket
2个回答
0
投票

这似乎是Solaris中的一个错误,它在Linux中运行良好。 (您没有完全指定操作系统,但我看到您使用了-lsocket编译器选项,这在Linux中不是必需的)


0
投票

当我尝试使用Oracle Developer Studio 12.6中IDE的默认编译器设置在Solaris 11.3上编译C ++项目Boost.Asio时,我遇到了这个问题(即msg_flags不是msghdr结构的成员)。 Boost.Asio的构建系统似乎可以解决问题by providing these options to the compiler

-D_XOPEN_SOURCE=500 -D__EXTENSIONS__

以及这些链接器:

-lsocket -lnsl

我在IDE中将这些设置添加到项目后解决了我的问题。

我不确定它是如何工作的,但它可能与Oracle documentation有关,即msg_flagsmsg_controlmsg_controllen仅在“libxnet接口”而不是“libsocket接口”中可用。

同样值得注意的是Samba项目如何解决这个问题:https://bugzilla.samba.org/show_bug.cgi?id=11053(他们是#define-ed _XPG4_2__EXTENSIONS__)。

© www.soinside.com 2019 - 2024. All rights reserved.