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
[26040] Socket 통신에 대하여 ...
정성원 [] 1254 읽음    2003-06-23 09:58
현재 메인 서버 프로그램이 5명의 서버 프로그램으로 클라이언트의  Connect Request를 수신하면 DisConnect Request를 수신하기 전까지 계속 데이타를 송신합니다. 중간에 클라이언트의 Request는 없습니다. (DisConnect Request 이외의 요구 패킷이 없음)

그런데 이 서버 프로그램이 가지는 최대 접속자 5명을 늘리기 위하여 서버 프로그램을 변경하면 빠르겠지만 그럴 수 없는 상황이라 중간 서버를 하나 만들었습니다. 중간 서버는 메일 서버로 연결을 가지는 1개의 Client 소켓(TClientSocket *ClientSocket;)과 여러 클라이언트(최대 100명)의 연결을 지원하는 서버 소켓(TServerSocket *ServerSocket;)을 각 하나씩 두었습니다. 그래서 클라이언트 소켓이 메인 서버로 연결되어 데이타를 수신할 경우 서버 소켓에 접속된 모든 클라이언트에게 데이타를 송신합니다.

클라이언트 소켓에 메인 서버에 연결되면 Thread로 Execute() 함수에서 다음과 같은 동작을 합니다.


while ( ( MainForm->ClientSocket->Active == true ) && 
        ( MainForm->ServerSocket->Active == true ) )
{
    receiveLength = MainForm->ClientSocket->Socket->ReceiveBuf(buf,MAXLEN);
    if ( receiveLength < 1 )   continue ;
              
    if ( MainForm->toVideoServerSocket->Socket->ActiveConnections != 0 )
    {
        for ( int i = 0 ; i < MainForm->ServerSocket->Socket->ActiveConnections ; ++i )
        {
            if ( MainForm->toVideoServerSocket->Socket->Connections[i]->Connected == true )
            {
                dataLength = MainForm->ServerSocket->Socket->Connections[i]->SendBuf(buf, receiveLength) ;
                if ( dataLength < 1 )   --i ;
            }

            Sleep ( 1 ) ;
         }
     }
}


그런데 여기서 2가지 궁금한 점이 있습니다.

1. 1개의 소켓에서 위와 같이 100여명의 최대 접속자가 동시에 접속시 데이타를 송신하는데 속도가 느려지는 것은 당연하겠죠? 그러면 동영상 데이타의 경우는 1개의 소켓당 20명씩 분리하여 5개의 Client 소켓을 사용하는게 더 낳은지(이럴 경우 5개의 Thread가 동작하는데 cpu 사용률이나 뭐 그런 문제점은 없는지?) 아니면 1개의 소켓으로 100여명을 지원하기 위한 더 낳은 방법은 없는지 궁금합니다. 단, TCP/IP 기반이며 UDP는 불가능합니다.

2. 코드 중간에 접속된 모든 클라이언트에게 Looping으로 데이타를 송신할때 SendBuf 함수에서 return value가 -1이 나옵니다. (dataLength = MainForm->ServerSocket->Socket->Connections[i]->SendBuf(buf, receiveLength) ;)
그래서 다음 줄에 return value가 -1이면 다시 보내도록 조정해두었는데요 ... 이런 현상이 왜 발생하는지 궁금합니다. 분명히 보낼 데이타의 사이즈와 보낸 데이타의 사이즈를 출력해보면 보낼 데이타의 사이즈는 -1이 아닙니다.

넘 두서없이 질문을 드렸는데 고수님들의 답변 부탁드리겠습니다.

+ -

관련 글 리스트
26040 Socket 통신에 대하여 ... 정성원 1254 2003/06/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.