0

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

sc:在函数“main”中:

sc:59:错误:结构没有名为“msg_control”的成员

sc:60:错误:结构没有名为“msg_controllen”的成员

sc:61:错误:结构没有名为“msg_flags”的成员

*错误代码 1

4

2 回答 2

1

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

于 2013-07-12T01:48:28.897 回答
0

我在尝试使用 Oracle Developer Studio 12.6 中 IDE 的默认编译器设置在 Solaris 11.3 上编译 C++ 项目 Boost.Asio 时遇到了这个问题(即msg_flags不是结构的成员)。Boost.Asio 的构建系统似乎通过向编译器提供这些选项来msghdr解决这个问题:

-D_XOPEN_SOURCE=500 -D__EXTENSIONS__

这些到链接器:

-lsocket -lnsl

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

我不确定它究竟是如何工作的,但它可能与Oracle 文档中所说的有关msg_flagsmsg_control并且msg_controllen仅在“libxnet 接口”而不是“libsocket 接口”中可用。

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

于 2018-09-09T00:10:05.647 回答