2010-11-18 1 views
0

にDNSプロキシを作成し、検索を行うには、GoogleのDNSサーバーのTCPポート53にクエリを転送して、提供さ答えを返しますGoogleによって。私はUDPポート53からDNSクエリを受け付けCでの単純なDNSプロキシを構築したいC

はい、これは学校のプロジェクトであり、私は始めるためにどこ私にはわからないように混乱しています。

協力いただきありがとうございます!!

答えて

2

あなたがネットワークへのメッセージを記述するためのAPIを選んだために必要なすべての最初の。 ウィンドウの場合、Winsock APIです。 UNIX系のシステムでは、BSD Sockets APIがあります。
ほとんどのコースでBSD APIが使用されていますが、

今、あなたの手順は次のようになります。

  • は、DNSの実装のためのrfcを見てください。一部のフィールドを変更する必要がある場合があるため、要求メッセージと応答メッセージの形式のみに焦点を当てることができます。いくつかのフィールドを変更する必要があり、DNSクエリ要求を受信するように
    • サーバー側のコード:
    • は今2つのモジュールで構成され、クライアント・サーバ・コードを記述します。
    • GoogleのDNSサーバーと対話モジュールにそれを渡します。
    • 応答をキャプチャして、要求元のクライアントに転送します。
2

(再びあなたには、いくつかのフィールドを変更する必要があるかもしれません)あなたが要件とラッキー打ってきました - あなたはUDPから行っているので - > TCPは、それが実際にUDPを行うよりもずっと簡単だ - > UDP 。

具体的には、私は何を意味することは外側に面している側は接続指向ソケットを使用しているので、あなたはあまりにも長い間、あなたが新しいを使用すると、すぐにあなたが受け取る応答はあなただけ送信されたクエリに関連しなければならないことを知っているということです各クエリのTCPソケット

外側に面している側は、UDPであった場合には、各応答が関連照会どの把握するために多くの困難になり - 応答は、クエリと同じ順序で到着したプロトコルでの保証はありません。

マルチスレッディングが必要ない場合には、(擬似コードで)

"open" a UDP socket 
"bind" that socket to port 53 
while (true) { 
    "recvfrom" a packet from the UDP socket 
    ... and remember the address it was received from 
    "open" a TCP socket 
    "connect" it to Google's DNS 
    "write" the length of the original query (two bytes, network order - RFC 1035) 
    "write" the contents of the original query 
    "read" a two byte length header 
    "read" that many bytes from the TCP socket 
    "close" the TCP socket 
    "sendto" those bytes back over the UDP socket to the original client address 
} 
関連する問題