sys/socket отсутствует член для msgdr: msg_control, msg_controllen, msg_flags

Я пытаюсь написать небольшое клиент-серверное приложение, используя 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


person Mario    schedule 27.05.2013    source источник


Ответы (2)


Похоже, это ошибка в Solaris, но в Linux она работает нормально. (Вы точно не указали ОС, но я видел, что вы использовали опцию компилятора -lsocket, которая не нужна в Linux)

person Yu Hao    schedule 12.07.2013
comment
Да, ошибка наблюдалась в Solaris 11.3, а в Solaris 11.4 ее исправили. - person Tanz87; 15.11.2020

Я столкнулся с этой проблемой (т. е. msg_flags не является членом структуры msghdr) при попытке скомпилировать проект C++ Boost.Asio в Solaris 11.3 с использованием параметров компилятора по умолчанию для IDE в Oracle Developer Studio 12.6. Система сборки Boost.Asio, похоже, решает проблему путем предоставление этих параметров компилятору:

-D_XOPEN_SOURCE=500 -D__EXTENSIONS__

и это для компоновщика:

-lsocket -lnsl

Моя проблема была решена после того, как я добавил эти настройки в свой проект в IDE.

Я точно не знаю, как это работало, но это может быть как-то связано с документация Oracle, в которой говорится, что msg_flags, msg_control и msg_controllen доступны только в "интерфейсе libxnet", а не в "интерфейсе libsocket".

Также примечательно, как с этим справился проект Samba: https://bugzilla.samba.org/show_bug.cgi?id=11053 (они #define отредактированы _XPG4_2 и __EXTENSIONS__).

person Tanz87    schedule 09.09.2018