2017-11-10 15 views
0

로컬 호스트에서만 연결을 수락하여 실제로 HTTP 서버로 작동하는 TCP 서비스를 개발했습니다. 이 클라이언트 컴퓨터의 브라우저에서 실행되는 일부 JavaScript 웹 기반 응용 프로그램은 AJAX를 사용하여이 서비스에 대한 요청을 만들어 JavaScript 응용 프로그램 (일부 하드웨어 리소스 액세스)에서 일반적으로 금지되는 고급 기능을 수행합니다. 벌금.TCP 서비스에 대한 액세스를 현재 사용자 세션으로 제한

빠른 사용자 전환을 사용하여 여러 사용자가 동일한 컴퓨터에 로그온하거나이 시스템이 Windows 서버에서 사용되는 경우 ... 여러 개의 TCP 서비스 인스턴스가 실행되고 있어야합니다. . 주어진 범위 내에서 동적 인 TCP 포트에 바인드 할 수 있고 바인딩 된 포트를 찾기 위해 자바 스크립트에서 약간의 폴링을 만들 수 있습니다. 그러나 클라이언트가 동일한 사용자 세션에 해당하는 TCP 서비스 인스턴스에 연결되는 것을 보장하는 방법을 이해할 수 없습니다.

내 로컬 서비스에서 동일한 사용자 세션에 속한 피어 만 연결할 수 있도록하려면 어떻게해야합니까? (클라이언트 응용 프로그램과 서비스가 동일한 컴퓨터에서 실행 중임을 알면)

몇 가지 아이디어가 있지만 실제로는 분명하지 않습니다. peer PID을 추측하고 클라이언트 프로세스가 실행중인 세션을 확인하십시오 (ProcessIdToSessionId 사용). 그러나 그것은 약간 복잡해 보입니다. 또는 WSASetSocketSecurity 소스를 만들어 동일한 세션 (또는 사용자)의 프로세스 만 연결할 수 있도록 할 수 있습니다 (SOCKET_SECURITY_SETTINGS 구조체를 어떻게 채워야합니까?).

모든 아이디어를 환영합니다. 주요 대상은 windows이지만, 답변이 다른 플랫폼 (linux, mac OS)을 해결하면 더 행복해집니다.

답변

0

요약하면 소켓을 특정 세션으로 제한 할 수 없습니다. 확실히 어떤 휴대용 방식도 아닙니다. 소켓은 바인딩에 대한 훌륭한 제어 레벨을 가지고 있지 않습니다.

가장 간단한 방법은 각 수신 서버를 각 세션에 고유 한 다른 IP/포트 쌍에 바인딩하는 것입니다.

적어도 Windows에서는 활성 TCP 연결 (GetTcpTable2() 및 friends)을 열거 할 수 있습니다. accept()을 클라이언트 연결에 연결하고 해당 소켓의 IP/포트 쌍 (getsockname()getpeername())을 얻은 다음 해당 쌍을 포함하는 시스템 테이블에서 해당 프로세스 ID를 찾아 해당 프로세스의 세션 ID를 쿼리합니다 (ProcessIdToSessionId())을 수락 한 다음 서버 소켓을 수락 한 서버 프로세스와 다른 세션에 속한 경우 클라이언트 소켓의 연결을 끊습니다.

+0

각 세션마다 서로 다른 포트를 수신하는 서버를 가지고 있어도 괜찮습니다. 이것은 이미 사실입니다. 그런 다음 문제는 JavaScript에서 동일한 세션에 속한 서버가 연결된 포트를 추측합니다. 브라우저에서 실행되는 JavaScript로는 많은 일을 할 수 없으므로 (OS 세션과 관련된 정보를 얻는 것은 불가능합니다.) 문제를 해결할 방법은 서버 측에서 가능할 것이라고 생각했습니다. 그러나 클라이언트 측에서 전체 문제를 해결할 수있는 방법이 있다면 괜찮습니다. – dim

+0

@ dim 소켓은 세션에 바인딩되지 않습니다. Javascript가 랜덤 포트를 발견하는 유일한 방법은 성공할 때까지 모든 가능한 포트를 시도하는 것입니다. 그렇지 않으면 서버가 Javascript가 액세스 할 수있는 포트를 게시해야합니다. 나는 다른 접근법을 제안 할 것이다. 세션 별 서버를 전혀 사용하지 마십시오. 전역으로 실행되는 하나의 서버를 사용하고 모든 세션을 동일한 서버에 연결 한 다음 클라이언트 정보를 사용하여 세션을 식별하고 클라이언트의 세션에없는 데이터에 대한 액세스를 제한하십시오. –