client source 포트로 특정 포트 할당 받지 않기.
글쓴이: colortime / 작성시간: 금, 2015/07/17 - 9:10오후
환경 : 윈도우 소켓 / c++ / vs 2005
소켓 프로그래밍을 할 때 client는 bind 해주지 않으면 자동으로 os로부터 source port를 할당받게 되잖아요?
그 때 포트 몇개를 제외하고 할당 받는 방법이 있을까요?
bind를 명시적으로 사용해서 지정하는건 해결책이 안될 것 같습니다. 많은 연결이 필요한 프로그램이라서..
그리고 방화벽으로 포트 사용을 막거나, 다른프로그램으로 사용하지 않을 포트를 선점하는 것도 안될 것 같습니다.
상황 :
한 호스트에서 2가지 프로그램이 돌고 있습니다.
프로그램 1 : 간헐적으로 2000번 포트를 열어서(리슨) 외부의 메세지 인입을 받음 (서버 역할)
프로그램 2 : 요청이 있을 때 마다 새로운 connection을 외부 서버에 생성.
프로그램 1은 간헐적으로 2000번 포트를 사용하다 보니 2000번 포트가 사용이 안되는 순간이 있는데,
이때 프로그램 2가 2000번 포트를 소스포트로 사용하는 경우가 생기면서 프로그램1이 포트를 열려고 할 때 충돌되는 현상이 있습니다.
프로그램 1은 제가 작성한 프로그램이 아니라서 수정할수가 없구요, (바이너리만 존재) 프로그램 2는 제가 만들어서 수정할 수 있습니다.
프로그램 2의 socket 통신을 어떻게 구성하면 2000번 포트는 사용안하는 client를 만들 수 있을까요?
Forums:
그냥 보자마자 단순하게 생각한 건데, 포트번호
그냥 보자마자 단순하게 생각한 건데, 포트번호 풀링(?) 비슷하게 자료구조를 만들면 어떨까 합니다.
1. List 자료 구조의 변수로 AvailPorts, BuzyPorts를 만든다.
2. AvailPorts에 사용하려는 범위의 포트를 모두 Insert한다.
3. 클라이언트는 연결이 필요할 때, AvailPorts에서 하나씩 할당 받고, 할당받은 Port를 BuzyPorts에 넣는다(풀링 클래스를 도입하는 것도 좋을듯)
4. 클라이언트는 할당 받은 포트를 bind하여 연결에 사용한다.
5. 클라이언트는 해당 연결이 종료되면, 할당받았던 Port를 BuzyPorts에서 삭제하고, 다시 AvailPorts에 넣어준다.
자료구조는 적합한 것을 잘 선택하면 되고, 쓰레드를 쓰는 프로그램이면 자료구조 조작시 잘 잠궜다 풀어주고...
Signature :) - "여유를 갖고 행동하되 게을러지지 말자"
답변 감사합니다. 괜찮은 방법인거 같습니다. 한
답변 감사합니다.
괜찮은 방법인거 같습니다.
한 포트만 블랙리스트 하는 방법을 찾지 못한다면,
말씀하신대로 가용한 포트번호에서 선택하도록 만들어야겠군요.
bind에 실패처리 까지 하면, 현재 문제는 해결될거 같습니다.
감사합니다 !
Ephemeral port에 대해서 모르고 댓글을
Ephemeral port에 대해서 모르고 댓글을 달았었네요. 이미 해결하셨겠지만
다음 url들을 참고하시면 될 것 같습니다.
https://en.wikipedia.org/wiki/Ephemeral_port
http://www.ncftp.com/ncftpd/doc/misc/ephemeral_ports.html
http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&pageno=0&wid=1807&rssMode=1&wtype=0
Signature :) - "여유를 갖고 행동하되 게을러지지 말자"
댓글 달기