繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM