我编写了一些代码,通过 UDP 从另一个源 (192.168.10.2) 请求 1000 个大小为 4094 的数据包,并使用 Wireshark 确认数据到达我的主机 (192.168.10.1) - 源端口 1234 和目标端口 4321,但我的处理代码挂在recvfrom上。我在下面的代码片段中是否错误地使用了它?
int sockfd;
char buffer[4094];
struct sockaddr_in servaddr, cliaddr;
FILE* f = fopen("output.bin", "wb");
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){
perror("error creating socket");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
memset(&cliaddr, 0, sizeof(cliaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(4321);
servaddr.sin_addr.s_addr = inet_addr("192.168.10.2");
bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr));
int n;
socklen_t len;
for (int i=0; i<1000; i++){
len = sizeof(cliaddr);
n = recvfrom(sockfd, (char *)buffer, 4094, MSG_WAITALL,
(struct sockaddr *) &cliaddr, &len);
if (n>0){
if (n<4094){
buffer[n] = '\0';
}
fwrite(buffer, 1, n, f);
}
}
fclose(f);
close(sockfd);
已经绑定了客户端地址,需要绑定本地接口地址。
servaddr.sin_addr.s_addr = inet_addr("192.168.10.2");
应该是
servaddr.sin_addr.s_addr = inet_addr("192.168.10.1");
或者您可能更喜欢这样说它可以绑定到所有接口:
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);