質問

私は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」でこのプログラムを実行します。私はデータグラムを受信しません。何が間違っているのでしょうか?

役に立ちましたか?

解決

クライアントから放送メッセージのためのUDPポート68上の

あなたのようなルックスをしているリスニング?私が正しくDHCPを読んでいる場合は、それを受け取るために、ポート67でリッスンする必要があるであろうので、クライアントは、UDPポート68からの要求が、サーバー上のTO UDPポート67を「発見」そのbroadcaseを送信します。

のdhclientでそれをしようとする前に、あなたにしているコードをテストするための簡単な「最初の」テストはnetcatを使用してサーバーに話をしようとするだろう。

のようなコマンドライン
echo "Foo" | netcat -u localhost 68

あなたの現在のコードが受信するパケットが発生する必要があります。

もう一つの良いデバッグツールを使用すると、UDPパケットがあるdhclientと彼らが含まれていることにより、送信されている正確に何を見るようになるのwiresharkである。

他のヒント

にdhclientは外を行う可能性があります知っている人(私はあなたが間違ってやっているものではありませんが、私があなただったら、私は非常に簡単である私自身のクライアントを作成したいし、それが上のサーバーコードに話すことができるかどうかを確認します)あなたのコードにお問い合わせください。私はまた、一時的によく知られていない何かにポート番号を変更したいです。私は他のプログラムとのインターフェイスに干渉されないこの方法です。

私はチュートリアルにこれをお勧めします。また、rootとして実行していますか?あなたはそれ以外の場合はその小さい番号のポートを取得することはできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top