[英]DHCP : Cant receive reply from server
我正在使用Ubuntu 9.04。 我正在VMware工作站上运行它。 这是我的C代码:
int sockfd,cnt,addrlen;
const int on = 1;
struct sockaddr_in servaddr,cliaddr;
char reply[512];
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
exit(1);
}
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);
addrlen = sizeof(servaddr);
if (bind(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr)) < 0) {
perror("bind");
exit(1);
}
while(1)
{
cnt = recvfrom(sockfd, reply, sizeof(reply), 0,(struct sockaddr *) &servaddr, &addrlen);
if (cnt < 0) {
perror("recvfrom");
exit(1);
}
printf("\nReply Received\n");
}
我在一个终端上运行该程序,在另一个终端上运行“ dhclient”。 我没有收到数据报。 我究竟做错了什么?
我不确定您在做什么错,但是如果您是我,我将编写自己的客户端,该客户端非常简单,看看它是否可以与上述服务器代码进行对话(谁知道dhclient在联系您的代码之外还能做什么) )。 我还要暂时将端口号更改为不知名的端口号。 这样,我不会干扰任何其他程序和接口。
看起来您正在UDP端口68上侦听来自客户端的广播消息? 如果我正确读取DHCP,则客户端将从UDP端口68发送大写的“发现”请求,而从服务器上的UDP端口67发送,因此您需要侦听端口67才能接收它。
在使用dhclient进行测试之前,一个简单的“第一个”测试可以测试您的代码,即尝试使用netcat与您的服务器通信。 像这样的命令行
echo "Foo" | netcat -u localhost 68
应该导致您当前的代码接收到一个数据包。
另一个很好的调试工具是wirehark,它将使您准确查看dhclient发送的UDP数据包及其包含的内容。
我推荐本教程 。 另外,您是否以root用户身份运行? 否则,您将无法获得该低编号的端口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.