1

winsock を使用して、サーバー アプリが特定の (たとえば192.168.0.0/24) サブネットワークからの接続のみを受け入れるようにします。

私は2つのオプションを考えています:

  • 接続するたびにクライアントのアドレスを確認しますaccept

    while (true) {
        SOCKET clientSocket = accept(serverSocket, 
                                     (SOCKADDR *)&clientAddress, 
                                     &addressLenght);
        if (clientSocket == INVALID_SOCKET
        || clientAddress.sin_addr.S_un.S_un_b.s_b1 != 192 
        || clientAddress.sin_addr.S_un.S_un_b.s_b2 != 168 
        || clientAddress.sin_addr.S_un.S_un_b.s_b3 != 0) {
            closesocket(clientSocket);
            continue;
        }
    
        ...
    }
    
  • 対応するネットワークのローカル アドレスを見つけて、それをname引数として使用します。bind

    SOCKADDR_IN serverAddress;
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(13666);
    serverAddress.sin_addr.S_un.S_addr = inet_addr("192.168.0.1");
    
    result = bind(serverSocket, (SOCKADDR *)&serverAddress, 
                  sizeof(serverAddress));
    

他にどのようなオプションがありますか?

PS: より良い解決策があると言われました。しかし、私はそれを理解することはできません。

4

2 に答える 2

1

サーバーが存在するのと同じサブネットからの接続のみが必要な場合 (それが当てはまるかどうかは質問から明らかではありません) setsockopt()、TTL を 1 に設定するために使用できます。そのソケットのパケット (接続ハンドシェイクを含む) は、ルータを越えません。

于 2013-04-14T21:30:26.790 に答える