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

Networking DHCP:无法从服务器接收回复,networking,network-programming,dhcp,Networking,Network Programming,Dhcp,我正在Ubuntu 9.04上工作。我正在VMware workstation上运行此功能。这是我的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); }

我正在Ubuntu 9.04上工作。我正在VMware workstation上运行此功能。这是我的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");
}
intsockfd,cnt,addrlen;
const int on=1;
servaddr、cliaddr中的结构sockaddr\u;
字符回复[512];
sockfd=插座(AF_INET,SOCK_DGRAM,0);
if(sockfd<0){
佩罗(“插座”);
出口(1);
}
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
bzero(&cliaddr,sizeof(cliaddr));
cliaddr.sin_family=AF_INET;
cliaddr.sin\u addr.s\u addr=htonl(INADDR\u ANY);
cliaddr.sinu port=htons(68);
addrlen=sizeof(servaddr);
if(bind(sockfd,(struct sockaddr*)&cliaddr,sizeof(cliaddr))<0{
佩罗(“绑定”);
出口(1);
} 
而(1)
{       
cnt=recvfrom(sockfd,reply,sizeof(reply),0,(struct sockaddr*)和servaddr,&addrlen);
if(cnt<0){
perror(“recvfrom”);
出口(1);
} 
printf(“\nReply Received\n”);
}

我在一个终端上运行这个程序,在另一个终端上运行“dhclient”。我没有收到数据报。我做错了什么?

我建议这样做。另外,您是否以root用户身份运行?否则,您无法获得编号较低的端口。

我不确定您做错了什么,但如果我是您,我会编写自己的客户端,非常简单,看看它是否可以与上面的服务器代码通信(谁知道dhclient在与您的代码联系之外可能会做什么)。我还临时将端口号更改为不知名的端口号。这样我就不会干扰任何其他程序和接口。

看起来您正在UDP端口68上侦听来自客户端的广播消息?如果我正确读取DHCP,客户端将从UDP端口68发送其broadcase“discover”请求,但发送到服务器上的UDP端口67,因此您需要监听端口67才能接收它

在使用dhclient测试代码之前,一个简单的“第一”测试是使用netcat与服务器对话。像这样的命令行

echo "Foo" | netcat -u localhost 68
应该导致当前代码接收数据包

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