DHCP:カントは、サーバーからの応答を受け取ります
-
21-09-2019 - |
質問
私は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」でこのプログラムを実行します。私はデータグラムを受信しません。何が間違っているのでしょうか?
解決
あなたのようなルックスをしているリスニング?私が正しくDHCPを読んでいる場合は、それを受け取るために、ポート67でリッスンする必要があるであろうので、クライアントは、UDPポート68からの要求が、サーバー上のTO UDPポート67を「発見」そのbroadcaseを送信します。
のdhclientでそれをしようとする前に、あなたにしているコードをテストするための簡単な「最初の」テストはnetcatを使用してサーバーに話をしようとするだろう。
のようなコマンドラインecho "Foo" | netcat -u localhost 68
あなたの現在のコードが受信するパケットが発生する必要があります。
もう一つの良いデバッグツールを使用すると、UDPパケットがあるdhclientと彼らが含まれていることにより、送信されている正確に何を見るようになるのwiresharkである。
他のヒント
にdhclientは外を行う可能性があります知っている人(私はあなたが間違ってやっているものではありませんが、私があなただったら、私は非常に簡単である私自身のクライアントを作成したいし、それが上のサーバーコードに話すことができるかどうかを確認します)あなたのコードにお問い合わせください。私はまた、一時的によく知られていない何かにポート番号を変更したいです。私は他のプログラムとのインターフェイスに干渉されないこの方法です。
私はチュートリアルにこれをお勧めします。また、rootとして実行していますか?あなたはそれ以外の場合はその小さい番号のポートを取得することはできません。