구현 기능 : 대화방(공개, 비공개), 사용자 로긴 기능(id 중복체크), 서버에서는 현재 접속 사용자 ID 보기, 현재 개설 대화방 이름을 보는 기능이 있습니다. 구현 기법 : 서버는 하나의 스레드를 생성합니다. 그 스레드 안에서는 while ( 1 ) 블럭 안에 accept() 함수를 놓고 계속 클라이언트의 접속을 기다립니다. 일단, 클라이언트가 접속을 하면 accept() 함수로 넘겨져 온 소켓 핸들을 가지고 해당 클라이언트와의 통신을 전담하는 소켓 스레드 하나를 생성합니다. 그 스레드는 클라이언트가 접속을 끊을 때까지 살아 있습니다. 따라서, 1000개의 클라이언트의 접속이 생기면 1000개의 통신 전담 스레드가 생기는 것입니다. 프로그램을 눈으로 보고 익히는 것은 말이 안 됩니다. 한 번쯤 제대로 된 프로그램을 짜 봐야 그때마다 자신감이 생기고 실력도 늘어나는 것입니다. 제 생각에 공감을 하시는 분이 많을 것 같습니다. 그래서 그동안의 제 실력으로 그럴 듯한 프로그램을 만들려고 생각하다가 겨우 제 머리에서 나온 것이 채팅 서버와 채팅 클라이언트 프로그램입니다. 전 옛날부터 채팅 프로그램을 꼭 짜 보고 싶었거든요. 한 가지, 이 프로그램을 컴파일한 후, 동작시키려면 제어판에서 네트웍크/TCP-IP 셋팅 중에 IP 주소를 아무거나 쓰시고 DNS에다가는 호스트 이름으로 jsoft, 도메인 이름으로 intra.co.kr로 적어주시고 테스트를 하세요. 혹시 자신만의 DNS, IP 주소가 있다면 변경시키지 마시고 프로그램 소스에서 고치세요. 서버 Info 다이얼로그에 기본 DNS가 설정이 되어 있는데 이 값을 자신의 DNS로 바꾸시면 됩니다. 아니면, 클라이언트를 실행시켜서 접속 메뉴를 선택해서 나온 대화창에서 일일이 서버의 IP 주솟값과 DNS 이름을 써주시면 됩니다.
1999.08.23: 저는 복잡한 것을 싫어합니다. 그래서 조금 더 컴팩트하고 보기 쉬운 코드를 좋아하지요. 그런 이유로 사용자 인터페이스 부분을 프로그래밍하는 것을 개인적으로 굉장히 싫어하는 편입니다. 대개의 경우 사용자 인터페이스 부분은 노가다 식의 코드 양산이 되기 일쑤이죠. 그동안 이 ChatServer/ChatClient가 무척이나 마음에 안 들었습니다. 무지무지 조잡한 코드로 채팅이 되게 쑤셔 넣은 코드였거든요. 이제야 좀 한숨을 놓게 되는군요. 개량된 소스에는 아주 보기 편하실 겁니다. 자바로 프로그래밍해 본 경험을 살려서 코드를 단순화 했거든요. 자바란에 있는 채팅 서버/클라이언트의 코드를 보신 분은 이 프로그램을 분석하기도 무척 편하실 겁니다. 자바로 한 것과 같이 서버는 다중 스레드를 사용했고, 클라이언트는 단일 스레드를 사용했습니다. 제법 공부에도 도움이 될 만한 코드라고 생각이 되는군요.
1999.09.09: 간단한 버그 수정을 했습니다. 채팅 클라이언트를 실행시키고 나서 접속 메뉴로 서버와 연결한 뒤, 아이디를 입력하지 않고 접속을 끊어버리면 서버가 다운이 되어 버리는 것을 수정했습니다. 그 외에, 다이얼로그 폰트 수정과 입력 포커스를 조금 수정했습니다.
1999.10.16: ChatServer의 CPU 점유율 99%를 0%로 수정했습니다. 제가 소켓 조작에서 실수를 한 부분이 있어서 Accept 함수가 비동기로 실행이 되어 무한루프로 accept 함수를 실행시키게 된것이 정말로 무한정 실행이 되어 있더군요. 그래서 비동기로 동작하게 했던 코드 한 라인을 삭제해서 accept 함수가 블록킹되게 해 놓았습니다.
No | Writer | Date | Cnt. | Title | File(s) |
43 | 정성태 | 7/17/2003 | 6908 | 탐색기 Namespace Extension 컨테이너 (VC 6.0, ATL) 2002.03.24 | 1 |
42 | 정성태 | 7/17/2003 | 5369 | KBManager WebBand (VC 6.0, ATL/Script) 2001.10.01 | 1 |
41 | 정성태 | 7/17/2003 | 5391 | UrlMonDownload (VC 6.0, ATL) 2001.06.16 | 1 |
40 | 정성태 | 7/17/2003 | 5284 | IE 북마크 임포트 (VC 6.0, ATL, MFC 지원) 2001.01.20 | 1 |
39 | 정성태 | 7/17/2003 | 6157 | MsIE.exe (VC 6.0, ATL, HTML Parser 로서의 IHTMLDocument2 이용 및 IE 보안설정) 2000.11.23 | 1 |
38 | 정성태 | 7/17/2003 | 5959 | EnumIE.exe (VC 6.0, ATL, 현재 사용 중인 IE에 접속) 2000.10.24 | 1 |
37 | 정성태 | 7/17/2003 | 6073 | ReuseIE.exe (VC ++ 6,0, Internet Explorer 재사용) 2000.04.17 | 1 |
36 | 정성태 | 7/17/2003 | 5680 | RemoteViewer dll (VC ++ 6.0, ATL) 2000.03.13 | 1 |
35 | 정성태 | 7/17/2003 | 6173 | IESpy dll (VC ++ 6.0, ATL) 2000.02.28 | 1 |
34 | 정성태 | 7/17/2003 | 5462 | Bmp2Gif 콘트롤 (VC ++ 6.0, MFC) 2000.02.28 | 1 |
33 | 정성태 | 7/17/2003 | 5050 | Gif89a 콘트롤 (VC ++ 6.0, ATL) 2000.02.28 | 1 |
32 | 정성태 | 7/17/2003 | 5002 | 이미지 4버튼 (VC ++ 6.0, ATL) 2000.02.28 | 1 |
31 | 정성태 | 7/17/2003 | 6077 | 이미지 홀더 (VC ++ 6.0, ATL) 2000.02.28 | 1 |
30 | 정성태 | 7/17/2003 | 8896 | 이미지 뷰어 (VC ++ 6.0, ATL) 2000.02.28 | 1 |
29 | 정성태 | 7/17/2003 | 9459 | ChatClient (VC ++ 6.0, MFC) 1999.09.09 | 1 |
28 | 정성태 | 7/17/2003 | 10596 | Winsock2 SPI : LSP 예제 (VC ++ 6.0) 2001.08.07 | 1 |
27 | 정성태 | 7/17/2003 | 9842 | Echo Services Server (VC ++ 6.0, ATL Service) 2001.01.07 | 1 |
26 | 정성태 | 7/17/2003 | 12945 | FTP Client (VC ++ 6.0, MFC) 1999.09.14 | 1 |
25 | 정성태 | 7/17/2003 | 8852 | 모뎀 정보를 알아내는 클래스 (VC ++ 6.0, MFC) 1999.09.12 | 1 |
24 | 정성태 | 7/17/2003 | 13873 | Ping (VC ++ 6.0, MFC, CSocket Class) 1999.09.09 [1] | 1 |
23 | 정성태 | 7/21/2003 | 14642 | ChatServer / ChatClient (VC ++ 6.0, MFC, Win32 API Socket) 1999.08.01 | 2 |
22 | 정성태 | 7/17/2003 | 9217 | 성능 객체 카운터 (VC 6.0, Win32) 2001.07.07 | 1 |
21 | 정성태 | 7/17/2003 | 8944 | StringSplit 클래스 (VC++6.0, Win32) 2000.02.28 | 1 |
20 | 정성태 | 7/17/2003 | 8229 | SQLDirect 클래스 (VC++6.0, Win32) 2000.02.28 | 1 |
19 | 정성태 | 7/17/2003 | 6108 | ImeControl 클래스 (VC++6.0, Win32) 2000.02.28 | 1 |
18 | 정성태 | 7/17/2003 | 5152 | RegistryEx 클래스 (VC++6.0, Win32) 2000.02.28 | 1 |