2013-04-14 4 views
1

winsock 사용 내 서버 응용 프로그램이 특정 (예 : 192.168.0.0/24) 서브 네트워크의 연결 만 허용하도록합니다.특정 서브넷의 연결 만 허용

나는 두 가지 옵션을 생각하고 :

  • 확인 클라이언트의 주소 때마다 나는 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; 
        } 
    
        ... 
    } 
    
  • 네트워크를 해당 로컬 주소를 찾아

    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)); 
    

bind 내가 다른 어떤 옵션이 있습니까에 name 인수로 사용?

P .: 나는 더 나은 해결책이 있다고 들었다. 그러나 나는 그것을 알아낼 수 없다.

+0

주소가 실제로 구성 파일에서로드되기를 원합니다. 그렇지 않으면 네트워크를 재구성하여 번호를 다시 매길 필요가있을 때마다 네트워크 관리자가 * "사랑"합니다 *! –

+0

@EmilioGaravaglia 예, 물론입니다. 위 코드는 예제 일뿐입니다. – Igonato

+0

"더 좋은 해결책이 있다는 말을 들었습니다."-하지만 적어도 조금은 설명하기가 쉽지 않습니까? –

답변

1

서버가있는 동일한 서브넷의 연결 만 원한다면 (질문에 분명하지 않은 경우) setsockopt()을 사용하여 TTL을 1로 설정할 수 있습니다. 연결 핸드 셰이크) 라우터를 통과해서는 안됩니다.

1

하나의 서브넷에서만 클라이언트를 수신하려는 경우 올바른 해결 방법은 bind()에 해당 서브넷에 해당하는 어댑터의 로컬 IP에 대한 단일 수신 소켓을 사용하는 것입니다. OS가 필터링을 수행하도록하십시오.

여러 서브넷의 클라이언트를 수신해야하는 경우

, 당신은 하나 bind()는 각 서브넷에 로컬 IP에 대한 별도의 수신 대기 소켓 필요한 수, 또는 당신은 bind() 다음 INADDR_ANY (0.0.0.0) 및 단일 소켓은 클라이언트의 필터링 할 수 있습니다 수동으로.

수동으로 필터링하는 경우 대신 WSAAccept()을 사용해야하므로 CONDITIONPROC 콜백을 활용할 수 있습니다. 차이점은 accept()을 사용할 때 클라이언트가 OS에 의해 큐에 무조건적으로 수락되고 코드가 액세스하기 전에 accept()에 의해 완전히 연결된다는 것입니다. WSAAccept()을 대신 사용하면 클라이언트 원격 IP에 더 빨리 액세스 할 수 있으며 개별 대기열을 연결 대기열에 넣기 전에 개별 클라이언트를 수락할지 거부할지 선택할 수 있습니다.

관련 문제