소켓프로그래밍 사용중인 포트
글쓴이: hyun1023 / 작성시간: 수, 2005/01/26 - 2:08오전
메인에서 자식프로세스를생성하여 자식프로세스마다 p2p 연결을 합니다.(다중 서버)
bind 할때 같은 포트는 못쓰겠지요?
그럼 예를들어 디폴트로 6000번 포트를 쓰고 사용중이면 6001을 쓰고 해서 bind 하려고하는데 bind 할때 해당포트가 사용중인지 아닌지 알아야 할텐데 어떻게 알수 있나요? 그냥 무작정 bind 시켜본후 제대로 에러안나면 쓰고 에러나면 1증가시킨후 다시 bind 시키고 이런방법을 써야하는지 해당포트가 사용중인지 아닌지 알수있는 방법이 있는지 (프로그램내부에서) 답변주시면 감사하겠습니다.
Forums:
Re: 소켓프로그래밍 사용중인 포트
근데 FTP 서버의 경우는 21,20 고정으로쓰는데 다중 접속 서버이니 좀 궁금하네요..
각 클라이언트와 P2P로 연결한다는 말이 다소 애매 모호하기는 하지만 클
각 클라이언트와 P2P로 연결한다는 말이 다소 애매 모호하기는 하지만 클라이언트당 서버 프로세스 하나라고 전 알아들었습니다.
첫번째는 클라이언트가 접속을 요청할 때마다 새로운 포트에 바인드를 할 필요는 없습니다. 연결은 양쪽 주소 정보를 한쌍으로 가지고 있는 소켓페어로 구분되기 때문에 fork나 select등으로 클라이언트들을 다루시면 됩니다.
두번째로 FTP같은 프로그램의 포트가 공유되는것처럼(?)보이는 것은 bind를 생각해보시면됩니다. 소켓에 SO_REUSEADDR 옵션이 지정되 있지않다면 기본상태로는 한 포트에 하나의 프로세스만 지정될 수 있습니다. 여러 클라이언트가 서버로 동시에 한포트로 접속할 수 있는 것은 서버가 클라이언트에 연결 요청시마다 bind를 하지 않기 때문입니다. 실제로 클라이언트의 연결 요청을 받아들이는 부분은 bind->listen 후의 accept가 하죠.
클라이언트도 포트를 지정해 줄 수 있지만 대부분 이것은 직접 지정하지 않고 커널이 임의의 포트를 지정하도록하죠.
네트워크 서적의 bind()부분과 concurrent server 부분을 참고하시면 될 것 같습니다.
soMeCan
Re: 소켓프로그래밍 사용중인 포트
addressing에 대한 문제군요.
tcp/ip는 5개의 필드에 의해 구분됩니다.
즉, 통신(유니캐스트인.)의 종류 구분방법이 5개의 파라메터에 의한다는 얘기입니다.
{protocol, source ip, source port, destination ip, destination port}
예를들어, 다음을 가정하겠습니다.
** 가정
1) ftp 서버 : 192.168.0.1
2) ftp : 21
3) ftp-data : 20
**
이 경우, 5개 튜플을 ftp server입장에서 기술하면,
{tcp, 192.168.0.1, 21, *, * }
{tcp, 192.168.0.1, 20, *, * }
이렇게 2개의 소켓을 생성하고 대기하겠군요.
원격지 주소, 원격지 포트가 틀리다면 이는 전혀 다른 연결로 인지됩니다.
'*' 표는 임의의 값을 의미합니다.
심지어 원격지의 동일 ip에서 다수개의 연결도 '원격지port'만 틀리다면, 이는 틀린 연결인 것입니다.
5 associations라고 하지요.
Re: 소켓프로그래밍 사용중인 포트
심지어 원격지의 동일 ip에서 다수개의 연결도 '원격지port'만 다르다면, 이는 다른 연결인 것입니다.
이 말씀 하신거죠? ^^
왜 틀리다고 하신건지 혼자 갸우뚱하다가....
--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)
댓글 달기