Страницы

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

пятница, 14 февраля 2020 г.

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

#cpp #linux #c #сокет


Есть две моих программы на 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 нельзя.
Как изменить код так, что бы он работал корректно?
    


Ответы

Ответ 1



В итоге я не могу использовать сокет, длина которого более 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 байт. Откуда взялось это ограничение - долгая история. Но оно есть.

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

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