UDP ПЕРЕДАЧА ПАКЕТА - PullRequest
       6

UDP ПЕРЕДАЧА ПАКЕТА

0 голосов
/ 10 января 2020

Я использую дочерний процесс UDP, и я хочу отправить вывод команды, данной процессом отца, клиенту (клиент подключен к отцу с помощью TCP). То, что я сделал, показано ниже, но работает не так, как я хочу. Мне нужно отправить вывод в виде сообщений длиной не более 512 байт (то есть, если сообщение составляет 600 байт, оно должно отправить 512 + 88 байт). Клиент также должен выйти, когда получит сообщения, но в моем случае это не будет завершено. Я пытался использовать dup2, как я видел на примерах, но он не работает по UDP, так как соединение не установлено

//child process
FILE *fp;
fp = popen(s, "r"); //s = "ls"
while (fgets(buffer, sizeof(buffer), fp)) {
    sendto(sockfd, buffer, strlen(buffer)+1,  MSG_CONFIRM, (const struct sockaddr *)&servaddr, sizeof(servaddr)); 
}

pclose(fp);       
n = recvfrom(sockfd, (char *)buffer, 512, MSG_WAITALL, (struct sockaddr *)&servaddr, &len); 
printf("Client : %s\n", buffer); 

close(sockfd); 

//client process
int len; 

len = sizeof(cliaddr); 

while(recvfrom(sockfd, (char *)buffer, MAXLINE,  MSG_WAITALL, ( struct sockaddr *)&cliaddr, &len)){ 
    printf("%s", buffer);
}
sendto(sockfd, (const char *)hello, strlen(hello), MSG_CONFIRM, (const struct sockaddr *) &cliaddr, len); 
printf("Hello message sent.\n"); 

return 0; 

1 Ответ

0 голосов
/ 10 января 2020

while l oop в клиенте никогда не завершится.

По умолчанию вызов recvfrom блокируется. Это означает, что он будет ждать получения данных, поэтому, если данные не поступают, он просто сидит там. В отличие от TCP, нет соединения, которое может быть закрыто, поэтому recvfrom не вернет 0.

У сервера должен быть какой-то способ сообщить клиенту, что он завершил отправку данных, чтобы клиент знал, когда ответить, возможно, 1-байтовое сообщение с байтом, установленным в 0.

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