2009-04-05 8 views
1

어떻게 C가 프로그램 자체에 연결되어 있는지 감지 할 수 있습니까?소켓 프로그램이 자체에 연결되어 있는지 여부를 감지합니다.

예를 들어, 포트 1234에서 수신기를 설정 한 다음 포트 1234의 임의의 주소에 연결하기 위해 다른 소켓을 설정합니다. 내 프로그램에 연결하고 있는지 여부를 감지하고 싶습니다. 어떤 방법이 있습니까?

덕분에, 데이브

답변

0

당신은 결정 론적 방법으로 계산 연결에 마법 패킷의 시퀀스를 보낼 수 있습니다. 트릭은 송신자와 수신자가 프로그램의 동일한 인스턴스에서 온 경우 동일한 패킷 내용을 항상 계산하는 방식으로이를 수행하는 방법입니다. 프로그램이 무엇인지에 대한 정보가 더 도움이 될 것입니다. 그러나 대부분 프로그램 상태에 대해 일종의 해시를 수행 할 수 있으며 프로그램의 해당 인스턴스에 상당히 독창적 인 무언가를 제안 할 수 있습니다.

+0

단순한 투명한 HTTP 프록시 서버를 작성하고 있지만 클라이언트가 서버의 주소에 연결하려고 시도 할 때 프록시가 충돌하거나 최대 값을 초과하지 못하도록하고 싶습니다. –

+0

@Matt J : 왜 PID를 보내지 않으시겠습니까? –

+0

어떻게? HTTP 헤더로? 그러면 프록시가 그 모든 투명성을 가지지 못할 것입니다 ... –

0

동일한 프로그램이 아니라 동일한 컴퓨터에서 실행되는 동일한 인스턴스를 의미한다고 가정합니다.

네트워크를 통해 자신에게 다시 연결되는 경우 (두 개의 네트워크 카드 또는 포트 전달 라우터가 있거나 어딘가 인터넷에 비정상적인 경로가 있음)에 신경을 씁니까?

그렇지 않은 경우 임의의 주소가 루프백 (127.0.0.1)으로 확인되는지 또는 내가 아는 다른 IP 주소가 확인되는지 확인할 수 있습니다. 나는 네트워킹 전문가가 아니므로 몇 가지 가능성을 놓쳤을 수 있습니다.

"간접 루프백"사례에 신경 쓰면 두 끝점이 메모리를 통해 공유하는 무작위로 생성 된 번호를 포함하여 핸드 쉐이킹을 수행하십시오. 당신의 상황에 보안 문제가 있는지 나는 모른다 : 당신이 또한 연결을 안전하게하지 않는 한 이것이 MITM에 거의 확실하게 종속된다는 것을 명심해야한다.

1

Linux는이 문제를 해결할 수있는 도구를 제공합니다. 동일한 컴퓨터에 연결되어있는 경우

fuser -n tcp <port-number> 

을 실행하고 해당 포트를 수신하는 프로세스 목록을 가져올 수 있습니다. 그런 다음 /proc을보고 자신이 아닌 동일한 pid를 가진 프로세스가 있는지 찾아 낼 수 있습니다. 씹는 껌과 나르는 철사의 비트는 전체기구를 함께 유지하는 데 도움이됩니다.

다른 컴퓨터의 프로세스에 대해 쉽게 질문 할 수 없을 것이라고 생각합니다.

+0

당신은 다른 프로세스에게 당신에게 요청하고 응답을 되돌려달라고 요청할 수 있습니다. – hhafez

1

accept() 함수에 대한 매개 변수 중 하나는 struct sockaddr에 대한 포인터입니다.

서버 측에 accept()을 호출하면 서버 소켓에 연결된 원격 시스템의 주소가 채워집니다.

해당 주소가 해당 시스템의 인터페이스 주소와 일치하면 클라이언트가 서버와 동일한 시스템에 있음을 나타냅니다.

관련 문제