2017-12-05 18 views
0

안녕하세요 여러분,(Python/TFTP-Server) 기존의 IP 주소 (RNDIS)가 아닌 (아직) 수신 대기하는 방법은 무엇입니까?

내 문제 : 존재하지 않는 IP 주소에 대한 (tftp) 서버를 시작하고 싶습니다. 서버는 실제 네트워크 트래픽이있을 때 IP 주소가 원래 존재하는 USB/RNDIS를 의미합니다.하지만 (예 : Windows가 시작될 때) '초기'로 서버를 시작하고 싶습니다.

아이디어는 소켓을 0.0.0.0으로 bind() 한 다음 각 요청에서 "유효한"주소를 확인하는 것이 었습니다.

그런 접근법에 문제가 있습니다. recfrom()은 원본 주소 (클라이언트) 만 반환하지만 대상 (서버)은 반환하지 않습니다!

이 클라이언트가 말한 IP 주소를 얻으려면 어떻게해야합니까? (물론 최소한 동일한 서브넷을 확인할 수 있지만이 클라이언트가 말한 실제 서버 주소가 필요합니다!)

또는 우연히 bind() 기존 IP 주소?

건배.

p.s. 이것은 파이썬 tftpy 서버를위한 것입니다 ... - 서버를 시작할 때 클라이언트 측에서 ping 할 필요가있는 순간입니다 ...

답변

1

로컬 주소를 직접 가져올 방법이 없지만 보통 당신을 위해 작동 할 트릭이 있습니다.

방금 ​​recvfrom에서 버퍼와 클라이언트 주소를 얻었습니다. 이제 보조 UDP 소켓을 만들고 클라이언트 주소에 connect을 작성한 다음 getsockname을 사용하여이 새 소켓에서 로컬 주소를 가져옵니다. , 당신은 소스에 있었다으로 서버 시스템 를 사용하는 것과 IP 주소를 검색 할 수 있습니다 (UDP와 함께, connect 실제로 피어에 아무 것도 보내지 않습니다, 단지 주소 확인을 않습니다.) 그래서

을 이런 식으로 클라이언트 시스템에 다시 데이터 그램을 보냅니다. 일반적으로 클라이언트가 서버를 대상으로 사용했던 주소와 같습니다.

>>> cbytes, caddr = server_sock.recvfrom(2048) 
>>> print(caddr)       # Client IP and port 
('192.168.0.11', 38869) 

>>> aux_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
>>> aux_socket.connect((caddr[0], 9999)) # Connect back to client (port doesn't matter) 
>>> saddr = aux_socket.getsockname()  # Get local IP and port (ignore port here too) 
>>> print(saddr) 
('192.168.0.12', 39753) 

이것은 Linux에서 작동합니다. 나는 Windows에서 같은 방식으로 작동 할 것이라고 100 % 확신하지는 않지만, 기대하는 것이 합리적입니다.

+0

위대한 일, 고마워요! 포트가 중요하지 않을 때 recfrom()의 포트를 사용하지 않는 이유는 무엇입니까? 같은 [코드] 버퍼 raddr recfrom = (...) test_sock socket.socket = (...)은 test_sock.connect (raddr) ... [/ 코드] 그렇게하지 않는 한 사용되지는 않지만 호출에 필요한 포트를 생각해야합니다.) –

+0

위대한 일을했습니다, 감사합니다! 포트가 중요하지 않을 때 recfrom()의 포트를 사용하지 않는 이유는 무엇입니까? >>> 버퍼 raddr recfrom = (...) >>> test_sock socket.socket = (...) >>> test_sock.connect (raddr) ... >>> : 추천 그런 식으로 포트는 사용되지 않지만 호출에 필요하다고 생각할 필요가 없습니다.) –

+0

왜이 바보 같은 형식이 전혀 작동하지 않습니까 ???? –