피진 A, B 및 C를 사용하여 여러 개의 bonjour 클라이언트를 실행합니다.
B와 C가 A와 통신 할 때 A는 동일한 포트 (패킷을 볼 수있는 wireshark와 함께)를 사용합니다. MDNS와 통신은
이지만 B와 C는 각각 MDNS 용 소켓 포트와 소켓 연결 용 포트가 각각 다릅니다.
어떻게 작동합니까, 왜 단 하나의 포트에서만 작동합니까? 한 포트가 여러 연결을 제공하는 방법은 무엇입니까?
주의 : 다중 스레드 인 경우 연결을 허용하면 다른 빈 포트로 새 소켓을 만들지 만 wireshark에서 패킷을 보았습니다. 클라이언트 A는 통신 및 MDNS에 대해 동일한 포트를 사용했습니다.
하나의 포트에서 다중 연결
0
A
답변
5
실제로 TCP 연결은 (source_address, source_port, destination_address, destination_port) 튜플로 식별됩니다. 따라서 이들 중 하나가 다른 한 문제는 없습니다.
실제로는 프로그램이 주어진 포트에서 연결을 수신 할 때 발생합니다. 새로운 연결은 동일한 서버 포트 (그러나 다른 클라이언트 포트 또는 주소)로 생성됩니다. exmample를 들어
, 나는 웹 서버가 포트 80에서 수신이 내 리눅스 머신에서 :
$ telnet localhost 80 &
$ telnet localhost 80 &
$ lsof -n -i TCP
...
TCP 127.0.0.1:45601->127.0.0.1:80
TCP 127.0.0.1:45602->127.0.0.1:80
감사하지만 포트 5298을 사용하려고하면 동일한 시스템에서 여러 가지 다른 포트에 연결 자바 소켓, 예외 "주소 이미 사용 중"입니까? 튜플에서 요소가 변경되면 OK 일 것입니다. 어떻게 될까요? 그런 다음 다른 특정 로컬 포트 5555를 시도했는데 "연결이 거부되었습니다"라는 메시지가 나타납니다. 로컬 포트를 지정할 수 없습니까? 또는 소켓을 만들기 전에 로컬 지정 포트로해야합니까? IPTABLE에이 포트를 제한하려했지만 작동하지 않습니다! – seaguest
자, 튜플에서 요소가 변경되면 TCP 프로토콜과 관련하여 문제가 없다고 말했습니다. 그러나 소켓 API에는 추가 제한 사항이 있습니다. 즉, SO_REUSEADDR 옵션을 설정하지 않는 한 동일한 로컬 주소/포트에 두 번 이상 바인드 할 수 없지만 훨씬 더 미묘한 영향이 있습니다. 따라서 "이미 사용중인 주소"오류입니다. "Connection refused"오류는 대상 주소/포트에 연결하려고 시도 할 때 발생하며 해당 포트에서 수신 대기중인 것이 없습니다. – rodrigo
답변 해 주셔서 감사합니다. 실제로 MDNS가 기본 포트 5353을 사용한다는 것을 알지 못했기 때문에이 문제를 해결했으며 소켓 용으로 잘못된 포트를 구성했습니다. 그래서 이제는 잘 작동합니다! 다시 열정적 인 답변을 해주셔서 감사합니다! – seaguest