gpt4 book ai didi

c - DHCP 客户端在端口 68 上未收到响应

转载 作者:太空宇宙 更新时间:2023-11-04 04:09:03 24 4
gpt4 key购买 nike

我已经使用 wireshark 查看 DHCP 数据包结构。现在我已经创建了一个 DHCPDISCOVER 请求并将其存储在“消息”中。然后我在网络上广播它。

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

if (sockfd < 0) {
perror("socket");
exit(1);
}

setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST, &on,sizeof(on));
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR, &on,sizeof(on));

bzero(&cliaddr, sizeof(cliaddr));
cliaddr.sin_family = AF_INET;
cliaddr.sin_addr.s_addr = htonl(INADDR_ANY);
cliaddr.sin_port = htons(68);

if (bind(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr)) < 0) {
perror("bind");
exit(1);
}

bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("255.255.255.255");
addr.sin_port = htons(67);

cnt = sendto(sockfd, message, sizeof(message), 0,(struct sockaddr *) &addr, sizeof(addr));
if (cnt < 0) {
perror("sendto");
exit(1);
}

addrlen = sizeof(servaddr);

cnt = recvfrom(sockfd, reply, sizeof(reply), 0,(struct sockaddr *) &servaddr, &addrlen);
if (cnt < 0) {
perror("recvfrom");
exit(1);
}

printf("\nReply Received\n");

我运行这个程序并使用 wireshark 分析发送和接收的数据包。我看到 DHCPDISCOVER 数据包在端口 67 上发送,DHCPOffer 数据包在 wireshark 窗口的端口 68 上接收。我的客户端发送数据包很好但没有收到这个数据包并且它在 recvfrom 调用时阻塞。出了什么问题?

最佳答案

您需要在发送数据包请求之前发出接收,否则响应可能会在您准备好接收之前返回。

另外,response是否广播?如果没有,并且您当前没有为您的机器分配 IP 地址,那么您将在接收它时遇到一些麻烦,因为您的主机将通过 IP 地址过滤接收到的数据包,不知道响应是发往它的(即使链路层地址匹配),所以它不会传递它。

但我猜这是第一个问题。您将不得不使用线程或执行非阻塞接收,否则您的接收将被阻塞,因此您将永远无法发送请求。

关于c - DHCP 客户端在端口 68 上未收到响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1791130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com