【问题标题】:DHCP : Cant receive reply from serverDHCP : 无法接收来自服务器的回复
【发布时间】:2009-11-23 18:07:27
【问题描述】:

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

【问题讨论】:

    标签: networking network-programming dhcp


    【解决方案1】:

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

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

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

    应该让你的当前代码接收到一个数据包。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-05
          • 1970-01-01
          • 2013-03-28
          • 2023-03-07
          • 1970-01-01
          • 2015-07-26
          相关资源
          最近更新 更多