본문 바로가기

old_Coding/WinSocket

[Server] 쓰레드를 이용한 에코 서버




구현환경 : 비쥬얼 스튜디오 2008
구현일시 : 2009년도 초
네트워크 기반 : TCP/IP, WindowsSocketProgramming
작성자 : 이영득



 설명에 들어가기 앞서,
아래 기본 에코서버에서 사용하였던 accept(), send(), recv() 함수는 우선 블럭킹 모드이다.

 무슨말인고 하니,
프로그램이 진행되다가 위에 저렇게 생긴 함수안으로 들어가면
그에 상응하는 무언가가 이루어지기 이전에는 리턴되지 않는다(함수에서 빠져나오지 않는다).

 자세히 설명하면,
내가 accept() 함수를 호출했다고 하자.
프로그램은 이 함수 안으로 들어간다. 그리고 상식적으로 함수안으로 들어가서
리턴이 되야 정상인데, 이놈은 리턴이 안되고 머무른다. (마치 함수안에서 무한루프를 도는것처럼)
자. 그럼 현재 상황은 accept() 함수에서 기다리는 상황이 된다.
여기서 클라이언트측의 connect()함수가 호출되어 서버로 연결요청을 시도했다.
그러면 그제서야 accept()함수안에 들어가 있던 서버프로그램은 리턴되어 다음으로 넘어가게 된다.



 그래서 뭐가 문제냐면, 아래의 서버와 클라이언트가 1:1밖에 대응되지 못한다.
서버라는 대중적 기본조건이 1개서버와 다수의 클라이언트가 붙어야 하는데,
아래의 에코서버라면 그 능력이 발휘되지 못한다.
왜 대드락이 걸리게 되냐하면, 1번 클라이언트가 송,수신을 하고있는데 2번 클라이언트가
connect요청을 했다고하자.
아래 서버의 소스를 보면 알겠지만 루프는 recv->send 를 반복하게 된다.
즉, accept()함수는 호출되지 않는다.
그러므로, connect요청은 가볍게 무시된다.



 이에 대한 해결책으로 필자가 보고있는 한빛미디어의 '윈도우 네트워크 프로그래밍'책에서 나오는
첫번째 해결책이 바로 쓰레드다.
쓰레드에 관한 자세한것은 따로 글을 작성해서 올리는게 좋겠다. (스크롤이 압박이기때문에)
책을 참고하고 싶다면 '뇌를 자극하는 시스템 프로그래밍'을 추천한다.
간단히만 설명하자면 필자는 '프로세스 안에서 활동하는 연산단위'를 스레드라고 정의한다.
(이해가 안가신다면 잠시만 기다려달라 금방 올릴테니..)



 지금 스레드서버에서는 1개의 클라이언트가 붙을때마다 스레드가 1개씩 늘어난다.
하지만, 윈도우 운영체제에서 지원하는 한개의 프로세스에 대한 스레드 최대갯수는
2048개이다. 이것도 최대한이다. 그 안에 변수도 선언되고 메모리를 잡기때문에 실제로는
더 작다.




 필자도 학생이라 깔끔하게 코딩하는걸 잘 못하지만,
그래도 필요하신분들은 가져가시길..
(클라이언트 소스는 아래 글에 있습니다.)





ps.
 아 참.
이 소스는 원래 채팅기능이 없다.
원한다면 채팅기능을 넣어서 수정 or 코딩을 해보는것도 좋겠다.



'old_Coding > WinSocket' 카테고리의 다른 글

Circular Buffer (Ring Buffer) (*)  (2) 2009.12.26
[Server/Client] 기본함수로 구현한 에코 서버  (2) 2009.04.13