Unix Datagram Socket работает только для первого кадра

Я пытаюсь выполнить IPC с помощью UNIX-графа данных, но у меня возникают проблемы с реализацией. Я смог успешно выполнить сокет потока UNIX, но функциональность моей программы предусматривает использование граммов данных.

Вот код для отправляющей стороны:

struct sockaddr_un remote;
struct sockaddr_un local;
socklen_t size_remote;
socklen_t size_local;
if(out_sock == -1)
{
 if ((out_sock = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1)
 {
 perror("toYYYYY socket");
 exit(1);
 }
 char remote_path[28] = "/tmp/sockets/fromXXXXXXX0000";
 sprintf(remote_path + 24, "%d", portOffset + XXXXXX_CTRL_UDP_PORT);
 memset(&remote, 0, sizeof(struct sockaddr_un));
 remote.sun_family = AF_UNIX;
 strcpy(remote.sun_path, remote_path);
 size_remote = (offsetof(struct sockaddr_un, sun_path) + strlen(remote_path));
 char local_path[28] = "/tmp/sockets/toYYYYY0000";
 sprintf(local_path + 20, "%d", portOffset + XXXXXX_CTRL_UDP_PORT);
 memset(&local, 0, sizeof(struct sockaddr_un));
 local.sun_family = AF_UNIX;
 strcpy(local.sun_path, local_path);
 size_local = (offsetof(struct sockaddr_un, sun_path) + strlen(local_path));
 unlink(local_path);
 int rtv = bind(out_sock, (struct sockaddr *)&local, size_local);
 if(rtv)
 perror("toYYYYY bind");
}
written = sendto(out_sock, packet, bytes, 0, (struct sockaddr *)&remote, size_remote);
if (written != bytes)
{
 status = AS_FAILURE;
 perror("toYYYYY send");
}
return status;

Принимающая сторона обязательно получит первый отправленный фрейм. Однако функция sendto вызывает ошибку "Нет такого файла или каталога" в этой успешной отправке. Следующие два посыла выдают ту же ошибку, но функция sendto возвращает (-1) вместо правильной длины буфера, как в первом вызове. В последующих вызовах sendto ошибка становится "Конечная точка транскота не подключена".

Процесс получения более сложный для копирования/вставки, но по существу он сначала получает дескриптор файла из вызова сокета, задает структуры адресов, связывает и читает с помощью recvfrom().

Вот пример журнала вывода, который может быть полезен или не полезен:

Результат процесса приема

remote_len: 30
local_len: 26
local: '/tmp/sockets/toYYYYY5248' remote: '/tmp/sockets/fromXXXXXXX5248'
Binding to: '/tmp/sockets/fromXXXXXXX5248'
entered selected (This is receiving function with recvfrom())
recv from '/tmp/sockets/toYYYYY5248' len: 263
Closing socket

Отправка процесса вывода

send (successful call): Success
send: No such file or directory
send: No such file or directory
send: Transport endpoint is not connected
send: Transport endpoint is not connected
send: Transport endpoint is not connected
send: Transport endpoint is not connected
send: Transport endpoint is not connected
send: Transport endpoint is not connected
send: Transport endpoint is not connected
send: Transport endpoint is not connected

Мои вопросы:

  • Если SOCK_DGRAM отключен, и я использую sendto(), почему он жалуется на конечные точки транспорта?
  • Почему это работает для отправки первого кадра, но не для других? Почему успешный кадр все еще вызывает ошибку?
  • Как я могу это исправить?
1 ответ

Вы только инициализируете remote, когда out_sock == -1. Второй раз, когда вы вызываете функцию remote, будет неинициализирован, и вы получите сообщение об ошибке.

licensed under cc by-sa 3.0 with attribution.