Как сделать двунаправленные доменные сокеты Unix с SOCK_DGRAM?

Я пытаюсь написать простой сервер / клиент дейтаграмм Unix, и у меня возникли некоторые проблемы. Мне нужен сервер, который прослушивает сокет дейтаграммы и отправляет ответ на каждое полученное сообщение исходному отправителю. Я решил сначала попробовать с помощью socat чтобы быть "сервером" и писать клиент на C. Я запускаю socat так:

socat UNIX-DGRAM:/tmp/test.socket,fork EXEC:echo

Насколько я понимаю, это должно слушать /tmp/test.socket и ответить на все, что получено с той же строкой? Затем у меня есть клиентская программа, которая выглядит так (проверка ошибок удалена для ясности):

int s = socket(AF_UNIX, SOCK_DGRAM, 0);
struct sockaddr_un sa;
sa.sun_family = AF_UNIX;
strcpy(sa.sun_path, "/tmp/test.socket");

const char *data = "Testing data";
int err = sendto(s, data, strlen(data), 0, (struct sockaddr *)(&sa), sizeof(struct sockaddr_un));

printf("Sent!\n");

unsigned char *buffer = malloc(BUFFER_LENGTH);
struct sockaddr_storage recv_sa;
int recv_sa_len = 0;
int recv_len = recvfrom(s, buffer, BUFFER_LENGTH, 0, (struct sockaddr *)&recv_sa, &recv_sa_len);

for (int i = 0; i < recv_len; i++) {
    putc(buffer[i], stdout);
}
printf("\n");

Он должен отправить пакет (который работает), получить пакет, а затем распечатать его, но программа, похоже, не способна принять пакет. Что я здесь не так делаю, или у меня есть фундаментальное недопонимание о сокетах Unix? Спасибо!

3 ответа

Взгляните на пример AF_UNIX SOCK_DGRAM Майкла Керриска о программе клиент-сервер ( клиент, сервер), опубликованной в его книге "Интерфейс программирования Linux", глава 57.

Сокет должен иметь адрес для адресации для получения пакетов. Ты можешь позвонить bind() с уникальным именем файла сокета, основанным на PID или в linux, используйте абстрактный адрес с автоматической связью, если звонить раньше send:

bind(s, (const struct sockaddr *)&sa, sizeof(sa_family_t));

Вы должны позвонить через connect, прежде чем пытаться ничего не посылать на эхо-сервер.

Взгляните на: http://beej.us/guide/bgipc/output/html/multipage/unixsock.html

Другие вопросы по тегам