我正在尝试使用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
这似乎是Solaris中的一个错误,它在Linux中运行良好。 (您没有完全指定操作系统,但我看到您使用了-lsocket
编译器选项,这在Linux中不是必需的)
当我尝试使用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_flags
,msg_control
和msg_controllen
仅在“libxnet接口”而不是“libsocket接口”中可用。
同样值得注意的是Samba项目如何解决这个问题:https://bugzilla.samba.org/show_bug.cgi?id=11053(他们是#define
-ed _XPG4_2
和__EXTENSIONS__
)。