본문 바로가기

Developement

리눅스용 비동기 소켓 서버 (Async Socket Server) 소스


이 소스는 소켓 서버를 돌리기 위해 만든 소스 입니다만, 최초 제가 구한 것도 인터넷이고 (원래 만든 분이 누군지 모르겠습니다) 잘 주워다 지금 쓰고 있느라, GPL 에 따라 소스를 공개 합니다.
혹시 이 소스의 원작자가 되시는 분이 이 소스에 대해 권리를 주장하신다면, 내리도록 하겠습니다 ^^

소스의 다운로드:


필요 사항:
이 소스를 컴파일 하기 위해서는 POSIX 를 준수하는 컴파일러가 필요하며, Cygwin 에 있는 gcc 나 (minGW 는 불가), 리눅스 자체의 gcc 에서 컴파일이 가능 합니다.

사용 예제:
이 소스는 현재 AsyncSock 과 SocketWrap 이라는 부분으로 나뉘어져 있습니다.
SocketWrap 이라는 부분이 Sock 을 Class 로 좀 더 쓰기 편하게 만들어 져 있고, 이것을 상속받아 쓸수 있도록 만들어진 AsyncSock 으로 나뉩니다.

사용자는 AsyncSock 을 상속받아 하나의 추가 클래스를 만들어야 하고, 이 클래스 내부에 virtual 로 선언된 멤버들을 만들어 줘야 합니다.
아래 코드 처럼 상속을 받는 class 를 만든다음, 코드 내에서 구현을 해 주면 됩니다.

구현된 상속부 중 On... () 으로 시작하는 이벤트성 메소드들은 각 조건에 맞는 처리를 하도록 할 수 있으며, 각자 다음과 같은 역활을 합니다.

virtual void OnConnected(int idx);
클리언트가 연결 되었을때 호출 됩니다.
서버 자체의 소켓 번호가 0 이므로, 그 이상의 값이 연결 되면 계속 idx 값이 바뀌어서 호출 되게 됩니다.
 
virtual void OnRead(int idx);
클라이언트 소켓으로 사용시에 호출 됩니다.
서버가 보내는 데이터가 있을 경우 호출 됩니다.
 
virtual void OnWait(int idx);
서버의 경우에 불리며, idle 상태가 될 경우 호출 됩니다.
뭔가 접속된 클라이언트에 지속적으로 보낼 경우 이 구현부를 이용하면 됩니다.
 
virtual void OnClose(int idx);
연결이 종료 될때 호출 됩니다.
소켓의 소멸전에 뭔가 해야 한다면 이 구현부를 이용하시면 됩니다.
 
virtual void OnWrite(int idx);
서버(idx 가 0) 가 아닌 경우만 호출 됩니다만, 뭔가 버퍼에 쓸 경우 호출 됩니다.
호출되는 시점은 소켓에 값을 쓰고 나서 입니다.
 
virtual void OnError(int id, char *pMsg);
소켓 오류 발생시 호출 됩니다.
시스템 표준 error 값과, 내부 또는 시스템 메시지가 pMsg 에 넘어 오게 됩니다.

AsyncSock 클래스는 서버를 구동하기 위해 만든 비동기 소켓을 구현한 클래스 입니다.
원래 소스를 만드신 분의 잘못 또는 좀 이상하게 만들어 져 있던 부분을 바꾼 부분이 꽤 많습니다.

또한, 정상적인 구동을 위해서는 해당 클래스의 생성자 부분에서 pthread 나 mail 내의 loop 부분에서,
생성된 클래스 (예로 pSockSvr 라고 했을 경우) 에서 AsyncNotificationLoop(); 를 호출 해야 합니다.
다른 이벤트 메서드에서 해당 Loop 를 종료 시키려면,  SendStopAsyncNotiLoop(); 를 호출 하면 AsyncNotificationLoop() 가 종료 되게 됩니다(바로 직접적으로 종료 되지는 않습니다).

본 소스는 실제 CygWin 과 Linux(Ubuntu) , Embedded Linux (Arago, TI PSP) 에서 모두 함께 빌드되고 사용되고 있습니다만, 혹시 이 소스에 대해 의문이 있으시거나 하신분은 티스토리 계정이 있으신 분에 한해 댓글을 달아 주시는 대로 할수 있는 지원을 해 드리도록 하겠습니다.

감사합니다.