2013-02-04 1 views
2

관련된 12 개의 IP 주소가있는 Linux 서버에서 실행되는 Python 스크립트가 있습니다. 파이썬의 소켓 서버 (socketserver) 라이브러리에서 TCPSServer를 구현하고 모든 네트워크 인터페이스에서 수신 대기하도록했다.TCP의 대상 IP 캡처 Python SocketServer

여러 장치가이 서버에 연결되므로 대상의 IP 주소를 캡처 할 수 있어야합니다 (클라이언트의 IP 주소가 아니라 클라이언트가 생각하는 서버의 IP 주소). 에 연결). 지금은 클라이언트 연결을받을 수 있지만 클라이언트 IP를 볼 수는 있지만 대상 IP를 가져 오는 방법을 알 수는 없습니다.

누구나 socketserver 클래스에서 대상 IP를 캡처하는 방법을 알고 있습니까? 여러 인터페이스를들을 수 있다면 어떤 인터페이스가 작동했는지 알 수있는 방법이있을 것입니다.

이것은 네트워크 인터페이스가 알려지지 않은 여러 서버에 설치됩니다. 그러나 우리는 이것이 Linux 기반 시스템에서만 존재한다는 것을 알고 있습니다. 그래서 특정 OS 방식으로이 작업을 수행 할 수 있다면 그렇게해도 괜찮을 것입니다.

답변

1

socket 개체가있는 경우 socket.getsockname()을 사용하여 바인딩 된 IP 주소를 가져올 수 있습니다. 그래서의 라인을 따라 뭔가 :

# IPv4 
client = listening_socket.accept() 
(ipv4,port) = client.getsockname() 

# IPv6 
client = listening_socket.accept() 
(address, port, flow_info, scope_id) = client.getsockname() 

비록 모든 인터페이스에 결합 socket와 멀티 홈 서버에서 테스트하지 마십시오 - 모두 내가 알고, IPv4의 0.0.0.0 또는 IPv6의 동등한를 반환 할 수 있고, 그것은 것 그 모든 것이 유용 할 것입니다.

+0

나는 소켓 서버 코드의 일부를 다시 작성하지 않고도 그 일을 할 수 없게되었다. 그러나 그것은 파이썬 스크립트의 여러 인스턴스를 실행할 수있게 해주는 좀 더 쉬운 대답으로 이어졌습니다. 각 목록은 각자의 ip로 나열되었습니다. 그들은 오직 하나의 IP만을 듣기 때문에 연결중인 클라이언트의 IP를 얻을 필요가 없습니다. 감사! – Terry