C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[13704] Re:[질문] Server Socket 접속시 Port 중복 할당 문제
정남영 [kermi] 6165 읽음    2001-12-17 10:39
안녕하세요...

종현님께서 올리신글 잘 보았습니다. 하지만 제가 머리가 나쁜 관계로(--;;)
잘 이해가 안가는 부분이 많아서 답변 드리기가 좀 난감하네요...

암튼 지금 질문으로봐선 Port가 중복되는 문제를 걱정하고 계시는것 같군요.
이런 문제는 걱정안하셔도 됩니다.

socket통신은 Local IP + Local Port : Remote IP + Remote Port  이렇게 4가지의 요소가
조합되어 통신을 하게 됩니다. 이 네가지중 한가지만 값이 다르더라도 socket통신을 하는데는
아무런 문제요소가 되지 않습니다.

예를들어 2000번 포트를 사용하는 하나의 서버에 여러개의 Client가 접속하게 될때 서버측에서
상태를 점검해 보게 되면(Local이 서버가 되는 상태입니다) 다음과 같은 결과를 가지게 됩니다.

   Local IP      + Local Port : Remote IP       + Remote Port
   100.100.100.1      2000       100.100.100.2     1689
   100.100.100.1      2000       100.100.100.3     2544

참고로 말씀드리면 Client측의 Port번호는 주로 임시적인 번호를 사용하게 됩니다. 이는
winsock API함수중에 connect()함수를 호출할때 bind를 사용하지 않은 시점에서 호출하게 되면
자동적으로 할당받는 임시적인 port번호를 사용하기 때문입니다.

그러므로 종현님께서 TClientSocket을 사용하셨다면 지적하신 Port번호 25058번은
IP가 다른 상태에서 Port번호가 우연의 일치로 발생한 상태로 보여집니다.
제 생각엔 TCP 통신을 하는데 별다른 문제는 없을것으로 생각됩니다.

만약 port번호를 원하는 번호로 설정하실려면 bind()를 호출한후 connect()를 사용하면 됩니다.

만약 답변이 다른 의도로 설명 되었다면 다시 질문 올려 주세요 ^^;;


김종현 님이 쓰신 글 :
: 안녕하세요. 급히 해결해야 할 문제가 있어서 질문 드립니다.
:
: TServerSocket을 통해서 TCP 접속을 하고 있습니다. 현재 이기종간의 접속을 하고 있는데,
: Client쪽 Adapter가 오로지 전원 인가 즉시 접속(Connect)만 있고 접속해제(Disconnect)가
: 없습니다. 참고적으로 사용중인 Adapter는 Serial to TCP 에 사용되는 사용 제품입니다.
:
: 그러다보니, 자주 재접속하기때문에 시체 소켓들이 종종 생깁니다. 이 부분은 주기적으로
: 데이터를 뿌리면서 해결 했는데, 문제는 동시에 여러 Adapter를 통해서 Server Socket의
: TCP 서비스를 제공하다 보면, 동시에 한 포트에 여러개의 Adapter가 물린다는 것이죠.
:
: 참고적으로 내용을 직관적으로 보실수 있도록 코드 및 실행화면을 알려 드립니다.
:
: //---------------------------------------------------------------------------
: void __fastcall TForm_Main::Timer1Timer(TObject *Sender)
: {
:      // Check Logic
:      AnsiString     Str;
:      Memo1->Lines->Clear();
:      Memo1->Lines->Add("Connected Socket");
:      Memo1->Lines->Add("----------------------------------------");
:
:      for (int i = 0; i < ServerSocket->Socket->ActiveConnections; i++)
:      {
:           Str  = "Socket[";
:           Str += i;
:           Str += "] : IP -> ";
:           Str += ServerSocket->Socket->Connections[i]->RemoteAddress;
:           Str += ", Port -> ";
:           Str += ServerSocket->Socket->Connections[i]->RemotePort;
:
:           Memo1->Lines->Add(Str);
:      }
:
:      Memo1->Lines->Add("----------------------------------------");
:      Str  = "Total ActiveConnections = ";
:      Str += ServerSocket->Socket->ActiveConnections;
:
:      Memo1->Lines->Add(Str);
: }
: //---------------------------------------------------------------------------
:
: 다음은 실행 화면입니다.
:
: Connected Socket
: ----------------------------------------
: Socket[0] : IP -> 152.149.138.14, Port -> 25058
: Socket[1] : IP -> 152.149.138.23, Port -> 11433
: Socket[2] : IP -> 152.149.138.2, Port -> 1772
: Socket[3] : IP -> 152.149.138.13, Port -> 25058
: Socket[4] : IP -> 152.149.138.20, Port -> 22289
: Socket[5] : IP -> 152.149.138.2, Port -> 1773
: -------------------------------------
: Total ActiveConnections = 6
:
: 위에처럼 IP 152.149.138.13, 14번은 포트가 동시에 25058포트로 할당이
: 되었습니다. 현재 몇가지 테스트 중에 있는데, 혹시라도 경험있으신 분들의
: 조언을 얻고 싶어서 글을 올립니다. 실제 현 시스템에서는 IP당 하나의 접속
: 으로 제한되 있어서 접속된 IP를 가지고 소켓을 구분하면 가능하지만,
: 다른 방법으로 소켓의 포트 할당이 중복되는 현상을 해결할 수 있다면
: 알려 주시면 감사하겠습니다.
:
: 읽어 주셔서 감사합니다. 김 종 현 드림.
:

+ -

관련 글 리스트
13692 [질문] Server Socket 접속시 Port 중복 할당 문제 김종현 1429 2001/12/16
13704     Re:[질문] Server Socket 접속시 Port 중복 할당 문제 정남영 6165 2001/12/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.