Ответ клиенту через сокеты (UDP) из другого процесса - PullRequest
0 голосов
/ 15 апреля 2009

У меня есть сервер, чем процесс "обработчик команд". Он получает сообщения по протоколу UDP и передает работу для выполнения другому процессу, связываясь с этим процессом через опубликованный API (независимо от механизма IPC, который использует этот процесс). Наша система имеет несколько взаимодействующих процессов. Затем результат этого вызова API отправляется обратно клиенту из процесса обработчика команд.

Одной из команд является управление потоком данных, который генерируется из другого процесса для клиента (сообщение «connect»).

Должно ли это работать? Я отправляю IP-адрес и номер порта клиента другому процессу, этот процесс создает новый сокет и выполняет sendto ... Я проследил код и все выглядит хорошо, но клиент все еще заблокирован на получить ... Я знаю, если я отправлю sendto из обработчика команды, он получит ответ, но не из нового сокета.

Вот пример кода:

#define LEN 10000
char buffer[LEN];
int sfd, nsfd, bread, addrsize;
struct sockaddr_in addr;
addrsize = sizeof (struct sockaddr_in);
server.sin_family = AF_INET;
server.sin_port = htons(5200);
server.sin_addr.s_addr = INADDR_ANY;
sfd = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
bind (sfd, (struct sockaddr*)&server, addrsize);
bread = recvfrom(sfd, buffer, LEN, 0, &addr, &addrsize);

/* send IP address and port number through the API to another process */
/* in that other process, I do something like this...addr has the IP
 * address and port in it from above: */

nsfd = socket (AF_INET, SOCK_DGRAM, IPROTO_UDP);
sendto(nsfd, buff, bread, 0, &addr, sizeof(addr));

ТАК, пожалуйста, помогите!

Ответы [ 2 ]

1 голос
/ 18 апреля 2009

Ваш клиент (или межсетевой экран между ними), вероятно, будет сбит с толку, получив ответ от порта источника, отличного от того, на который он отправил запрос (так как ОС просто выберет случайный порт источника для нового сокета).

Одним из способов решения этой проблемы является использование опции сокета SO_REUSEADDR на сервере и явная привязка к правильному порту при отправке ответа. Но это также может привести к нежелательному побочному эффекту, заключающемуся в том, что UDP-запросы могут перенаправляться на один из других процессов, а не на сервер.

Другой вариант (если вы используете Unix / Linux) - передать сокет сервера другим процессам через сокет домена unix (через sendmsg и вспомогательные данные).

1 голос
/ 15 апреля 2009

Вы должны проверять наличие ошибки, что-то вроде

if((nsfd = socket (AF_INET, SOCK_DGRAM, IPROTO_UDP)) < 0} {
    perror("at socket open");
    // I'd call exit here, probably
}
if(sendto(nsfd, buff, bread, 0, &addr, sizeof(addr) < 0){
    perror("At sendto");
}

Вот хороший учебный пример здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...