我正在尝试使用UNIX域套接字编写一个小的客户机-服务器应用程序。
我正在为sendmsg/recvmsg使用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: error: structure has no member namedmsg_control‘ s.c:60:错误:结构没有名为msg\_controllen' s.c:61: error: structure has no member namedmsg_flags‘的成员 *错误代码1
发布于 2013-07-12 01:48:28
在Solaris中,这似乎是一个bug,在Linux中运行得很好。(您没有确切地指定操作系统,但我看到您使用了-lsocket编译器选项,这在Linux中是不必要的)
发布于 2018-09-09 00:10:05
在使用OracleDeveloperStudio12.6中IDE的默认编译器设置在Solaris 11.3上编译msg_flags项目Boost.Asio时,我遇到了这个问题(即msghdr结构的成员)。Boost.Asio的构建系统似乎可以解决通过向编译器提供这些选项的问题
-D_XOPEN_SOURCE=500 -D__EXTENSIONS__这些链接器:
-lsocket -lnsl在我将这些设置添加到IDE中的项目后,我的问题就解决了。
我不清楚它是如何工作的,但这可能与Oracle文档所说的msg_flags、msg_control和msg_controllen只在"libxnet接口“中可用,而不是"libsocket接口”有关。
还值得注意的是Samba项目是如何处理这个问题的:bug.cgi?id=11053 (它们是#define、-ed、_XPG4_2和__EXTENSIONS__)。
https://stackoverflow.com/questions/16772138
复制相似问题