0

次のようにCでDNSプロキシを作成しました:

"socket" - create socket to serve client
"bind" - bind that socket
while (true) {
    "recvfrom" - a package from socket 
    "socket" - create socket for dns server
    (1)
    "sendto" - send package to dns server
    "recvfrom" - respond from dns server
    "sendto" - send respond to client
}

それは働いています。しかし、(1) の位置にいるときに別のリクエストを受け取ったらどうなるでしょうか。待機中のリクエストでキューを追加するにはどうすればよいですか? 別のリクエストに取り組んでいても、すべてのリクエストを処理するように変更するにはどうすればよいですか?

4

2 に答える 2

0

ノンブロッキング ソケットの使用は、サービスが非同期になるように記述した場合にのみ有益です。つまり、上流の DNS クエリへの応答を待たずに下流からの別のパケットを待ちます。

両方のソケットを検討する必要がselectあり、パケットが入ってきたら、それがどこから来たのかを突き止めます。ダウンストリームからの場合は、要求を DNS アップストリームに送信します。DNS からの応答である場合は、元の要求を送信したクライアントを見つけて、そこで応答します。その構造では、ソケットの 1 つに応答しないコード内の場所はありません。

于 2012-11-18T15:59:15.403 に答える
0

listen()サーバーソケットをオンにする必要がありlisten、接続のバックログを指定できます。サイクルごとにその数までの新規クライアントの到着を処理できます。

select()次に、サーバー ソケットと未処理のクライアント ソケットで周期的に実行し、それらのリストを維持します。

   select(nfds, readfds, writefds, errorfds, timeout);

終了するときselect(タイムアウトでない限り)、3 つのリターン リストを検査し、読み取り、書き込み、またはエラー状態のソケットを処理し、適切にディスパッチします。

ここに詳細な例があります(これは Linux 用ですが、簡単に移植できます)。

于 2012-11-18T16:31:27.590 に答える