2017-03-26 1 views
-1

私はCで単純なDNSプロキシサーバーを構築しています。これは、ポート53でDNSクライアント(UDPを使用する)から要求を受信し、別のサーバーにクエリを転送し、サーバーから応答を得て、クライアントに送信します。ポート53でCでDNSクエリを取得します。バインドするアドレスは何ですか?

私はthis answerから擬似コードを実装しようとしましたが、クエリの受信につきました。

#include <stdio.h> 
#include <sys/socket.h> 
#include <stdlib.h> 
#include <netinet/in.h> 
#include <strings.h> 
#include <arpa/inet.h> 

#define ERROR -1 

void error_die(char *err_msg) 
{ 
    perror(err_msg); 
    exit(-1); 
} 

int  main(int argc, char **argv) 
{ 
    int     sockfd; 
    struct sockaddr_in servaddr; 

    if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == ERROR) 
     error_die("socket"); 

    bzero(&servaddr, sizeof(servaddr)); 
    servaddr.sin_family = AF_INET; 
    servaddr.sin_port = htons(53); 
    inet_aton("192.168.0.1", &(servaddr.sin_addr)); 

    if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof servaddr) == ERROR) 
     error_die("bind"); 
    return (0); 
} 

"192.168.0.1"は/etc/resolv.confにあるDNSサーバーのアドレスです。実行した後、私は"バインド:要求されたアドレスを割り当てることができません"を得ました。私は間違って何をしていますか?

答えて

0

あなたのアドレスにはbindを使用し、リモートアドレスでは使用しないでください。 INADDR_ANYを使用することができます

servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 

パケットを受信する必要がある場合は、recvfromを使用してください。 selectを使用して、recvfromを呼び出す前に利用可能なパケットがあるかどうかを確認することもできます。

関連する問題