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