Как сделать двунаправленные доменные сокеты Unix с SOCK_DGRAM? - PullRequest
4 голосов
/ 07 сентября 2011

Я пытаюсь написать простой сервер / клиент дейтаграмм 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 ]

10 голосов
/ 10 сентября 2013

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

0 голосов
/ 26 мая 2016

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

bind(s, (const struct sockaddr *)&sa, sizeof(sa_family_t));
0 голосов
/ 07 сентября 2011

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

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

...