UDP 数据包传输

UDP PACKET TRANSFERRING

我正在使用 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; 

客户端中的 while 循环永远不会退出。

默认情况下,对 recvfrom 的调用是阻塞的。这意味着它会一直等到它收到数据,所以如果没有数据到来,它就会停在那里。与 TCP 不同,没有可以关闭的连接,因此 recvfrom 不会 return 0.

您需要有一些方法让服务器告诉客户端它已完成发送数据,以便客户端知道何时响应,可能是字节设置为 0 的 1 字节消息。