我正在尝试使用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
答案 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_flags
,msg_control
和msg_controllen
仅在“ libxnet接口”而不是“ libsocket接口”。
还值得注意的是,Samba项目是如何处理此问题的:https://bugzilla.samba.org/show_bug.cgi?id=11053(由#define
-ed _XPG4_2
和__EXTENSIONS__
编辑)。