Страницы

Поиск по вопросам

среда, 24 апреля 2019 г.

Путь к UNIX сокету не может быть более 16 символов

Есть две моих программы на C/C++. Код для работы с Unix сокетами я брал с одного давно устаревшего сайта, других более понятных примеров я не нашел. В итоге я не могу использовать сокет, длина которого более 14-16 символов. Код клиента:
int sock; sock = socket(AF_UNIX, SOCK_STREAM, 0); struct sockaddr srvr_name; if (sock < 0) { perror("socket failed"); return EXIT_FAILURE; } srvr_name.sa_family = AF_UNIX; strcpy(srvr_name.sa_data, SOCK_NAME); if (connect(sock, &srvr_name, sizeof (srvr_name)) < 0) { perror("connect failed"); exit(2); } send(sock, buf, strlen(buf), 0);
Код сервера:
sock_ = socket(AF_UNIX, SOCK_STREAM, 0); if (sock_ < 0) { throw socket_exception(socket_exception::SocketError); } srvr_name.sa_family = AF_UNIX; filename_c = filepath.c_str(); strcpy(srvr_name.sa_data, filename_c); if (bind(sock_, &srvr_name, strlen(srvr_name.sa_data) + sizeof (srvr_name.sa_family)) < 0) { throw socket_exception(socket_exception::BindError); } listen(sock_, max_connect-1);
В strace(При том что путь к сокету я указал как /run/defu123456789/34567)
connect(3, {sa_family=AF_UNIX, sun_path="/run/defu12345"}, 16) = -1 ENOENT
Размер буфера sock_name ограничен 256 байтами. Использовать библиотеку boost нельзя. Как изменить код так, что бы он работал корректно?


Ответ

В итоге я не могу использовать сокет, длина которого более 14-16 символов.
Потому, что структура sockaddr описана в файле /usr/include/bits/socket.h таким образом:
/* Structure describing a generic socket address. */ struct sockaddr { __SOCKADDR_COMMON (sa_); /* Common data: address family and length. */ char sa_data[14]; /* Address data. */ };
Как видите, под поле адреса сокета отведено ровно 14 байт. Откуда взялось это ограничение - долгая история. Но оно есть.

Комментариев нет:

Отправить комментарий