DHCP:无法从服务器接收回复

时间:2009-11-23 18:07:27

标签: networking network-programming dhcp

我正在研究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'。我没有收到数据报。我做错了什么?

3 个答案:

答案 0 :(得分:1)

我不确定你做错了什么,但如果我是你,我会编写自己的客户端,这很简单,看看它是否可以与你上面的服务器代码通信(谁知道dhclient可能做什么外面的联系你的代码)。我还会暂时将端口号更改为一些鲜为人知的东西。这样我就不会干涉任何其他程序和接口。

答案 1 :(得分:1)

您是否正在通过UDP端口68监听来自客户端的广播消息?如果我正确地读取DHCP,客户端将从UDP端口68发送其广泛的“发现”请求,但是在服务器上发送TO UDP端口67,因此您需要在端口67上侦听以接收它。

在使用dhclient尝试代码之前测试代码的简单“第一”测试是尝试使用netcat与服务器通信。像

这样的命令行
echo "Foo" | netcat -u localhost 68

应该导致当前代码接收到数据包。

另一个很好的调试工具是wireshark,它可以让你准确地看到dhclient发送的UDP数据包及其包含的内容。

答案 2 :(得分:0)

我推荐这个tutorial。另外,你是否以root身份运行?否则你无法获得那个低编号的端口。