1

クライアントからの接続をリッスンして受け入れるソケットサーバーがあります。これは次のように機能します。

... do some pre-processing (socket, binds, etc)
//listen to client
if (listen(sockfd, BACKLOG) == -1) {
        perror("listen");
        exit(1);
}

printf("server: waiting for connections...\n");

while(1) {  // main accept() loop
    sin_size = sizeof client_addr;
    new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
    if (new_fd == -1) {
        perror("accept");
        continue;
    }
     //do something .....
    .....
}

特定の IP アドレスからの接続のみを受け入れるようにサーバーを制限するにはどうすればよいですか? たとえば、受け入れる IP アドレスのホワイト リストを含むテキスト ファイルを次の形式で作成
でき
ます

したがって、基本的には、ホワイトリストに含まれていないすべての IP アドレスからの接続を拒否したいと考えています。ソケット ライブラリ API がこれをサポートしていない場合は、最初に接続を受け入れてから、peeraddress がホワイトリストにない場合はすぐに socketfd を閉じてもかまいません。しかし、これを実行する方法、特定の IP アドレスがホワイトリストで指定された範囲内にあることを確認するにはどうすればよいですか? 任意の例をいただければ幸いです。

4

3 に答える 3

3

getpeernameを呼び出して、クライアントからアドレス情報を取得します。次に、IP アドレスがホワイトリストに含まれているかどうかを確認します。そうでない場合は、それらを切断します。

IP アドレスが特定の範囲内にあることを確認するには、アドレス バイトを 1 つの数値に変換します。次の方法でそれを行うことができます。

unsigned int n = bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3];

アドレス範囲の下限が A、上限が B、クライアントの IP アドレスが X の場合、それらはホワイト リストに登録されif (A <= X && X <= B)ます。

IP アドレスの各範囲が false であるとテストされた場合、それらはホワイト リストに含まれていないため、接続を解除する必要があります。

于 2012-03-14T05:52:51.960 に答える
2

WSAAccept()Windows でのみ、の代わりに使用できますaccept()WSAAccept()には、コールバック関数を渡すことができるパラメーターがあります。新しい接続が受け入れられる前に、その接続のアドレスと QOS 値を使用してコールバックが呼び出されます。CF_ACCEPTコールバックは、必要に応じて、、、CF_DEFERまたはを返すことができCF_REJECTます。

于 2012-03-14T17:07:35.800 に答える
2

ここで何が問題なのか、あるいは何が問題なのかわかりません。クライアントのアドレスは にあるtheir_addrので、ホワイトリストで検索してください。見つからない場合は、閉じます。おそらく、ホワイトリスト エントリと同じ形式に変換するかtheir_addr、その逆の形式に変換することをお勧めします。

于 2012-03-14T05:53:19.463 に答える