0

我正在开发 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”。我没有收到任何数据报。我究竟做错了什么?

4

3 回答 3

1

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

于 2009-11-23T19:06:39.933 回答
1

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

在尝试使用 dhclient 之前测试您的代码的简单“第一次”测试是尝试使用 netcat 与您的服务器交谈。类似的命令行

echo "Foo" | netcat -u localhost 68

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

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

于 2009-11-23T20:03:18.103 回答
0

我推荐这个教程。另外,您是否以root身份运行?否则,您将无法获得该低编号端口。

于 2009-11-23T19:05:14.010 回答