我正在研究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'。我没有收到数据报。我做错了什么?
答案 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身份运行?否则你无法获得那个低编号的端口。