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 字节消息。
我正在使用 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 字节消息。