테스트 중인 코드가 있습니다. 프로그램 A는 미리 정의된 소켓에서 프로그램 B가 연결되도록 수신 대기하고 테스트를 위해 프로그램 A와 B의 32개 인스턴스를 실행합니다. 나는 프로그램 A에게 포트 9001-9032를 수신하고 연결할 해당 포트와 함께 프로그램 B의 각 인스턴스에 대한 구성 파일을 입력하도록 지시하는 스크립트를 작성했습니다.
프로그램 A와 B를 시작하는 스크립트를 실행했을 때 netstat -tnap
모든 포트 9001-9032 중에서 실제로 사용된 유일한 포트는 다른 프로그램에서 사용했던 9001이라는 것을 발견했습니다(내 실수입니다!). 프로그램 A를 grep할 때 각 인스턴스가 수신 대기해야 하는 포트인 90**과 관련이 없는 완전히 무작위인 것처럼 보이는 포트에서 수신하고 있는 것을 발견했습니다. 그러나 내 프로그램 B(포트 9001-9032에 연결해야 함)는 B가 연결을 시도하는 포트에서 A가 분명히 수신 대기하지 않는 경우에도 프로그램 A의 모든 인스턴스를 찾아 연결할 수 있습니다. 어떻게 이것이 가능한지 혼란스럽습니다.
그것이 충분히 혼란스럽지 않다면 내 32개 프로그램과오직번호 32(청취 9032)는 오류로 인해 시작 시 종료됩니다. 포트에 바인딩을 시도할 때 주소가 거부되었습니다. 무슨 일이 일어나는지 알아보기 위해 포트 15001-15032에서 수신 대기하도록 프로그램을 변경해 보았지만 여전히 똑같은 동작이 나타납니다. 모든 프로그램이 임의의 포트에서 수신 대기하는 것처럼 보이며 32 프로그램이 연결을 설정할 수 없습니다.
내 포트가 왜 이렇게 동작하는지 설명할 수 있는 사람이 있나요? 제가 netstat이나 Linux 포트의 일부를 잘못 이해했나요?
답변1
socat
끊어진 것으로 추정되는 연결을 시뮬레이션하려면 임의의 바이트 스트림을 생성하는 명령줄 도구를 사용하는 것이 좋습니다 .
다음 명령을 사용하여 포트를 청취해 보십시오.
socat - TCP-Listen:9001
포트 9001에서 수신 대기하는 TCP 연결의 경우 또는
socat - UDP-Listen:9001
UDP 연결에 사용됩니다.
netstat -p
(또는 sockstat
)에 설정된 연결이 표시되는지 확인하세요 socat
. 그렇다면 코드를 더 자세히 조사하고 다음 위치에 소스 코드 관련 질문을 게시해야 합니다.stackoverflow.com.
다른 것이 있으면 알려주세요!