为什么这段代码收不到UDP数据包?

问题描述 投票:0回答:1

我编写了一些代码,通过 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);
c++ sockets udp
1个回答
0
投票

已经绑定了客户端地址,需要绑定本地接口地址。

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);
© www.soinside.com 2019 - 2024. All rights reserved.