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

时间:2013-05-27 11:25:38

标签: c sockets c89 unix-socket

我正在尝试使用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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

在尝试使用IDE的默认编译器设置在Solaris 11.3上编译C ++项目Boost.Asio时,我遇到了这个问题(即msg_flags不是msghdr结构的成员)在Oracle Developer Studio 12.6中。 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__编辑)。