0

私はUbuntu9.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");
}

このプログラムを1つの端末で実行し、別の端末で「dhclient」を実行します。データグラムを受け取りません。私は何が間違っているのですか?

4

3 に答える 3

1

クライアントからブロードキャストされたメッセージを UDP ポート 68 でリッスンしているように見えますか? 私がDHCPを正しく読んでいる場合、クライアントはブロードケースの「検出」リクエストをUDPポート68から送信しますが、サーバーのUDPポート67に送信するため、ポート67でリッスンする必要があります。

dhclient で試す前にコードをテストする簡単な「最初の」テストは、netcat でサーバーと通信してみることです。のようなコマンドライン

echo "Foo" | netcat -u localhost 68

現在のコードでパケットが受信されるようにする必要があります。

もう 1 つの優れたデバッグ ツールは、wireshark です。これを使用すると、dhclient によって送信されている UDP パケットとその内容を正確に確認できます。

于 2009-11-23T20:03:18.103 に答える
1

あなたが何を間違っているのかわかりませんが、私があなただったら、非常にシンプルな独自のクライアントを作成し、上記のサーバーコードと通信できるかどうかを確認します(コードに接続する以外に dhclient が何をするかは誰にもわかりません)。また、ポート番号をよく知られていないものに一時的に変更します。このようにして、他のプログラムやインターフェースに干渉することはありません。

于 2009-11-23T19:06:39.933 に答える
0

このチュートリアルをお勧めします。また、ルートとして実行していますか?そうしないと、番号の小さいポートを取得できません。

于 2009-11-23T19:05:14.010 に答える