오늘의 프로그래밍 삽질

In: Programming

27 Apr 2010

사실 이미 2주전의 삽질인데… 드래프트로 저장해 놓고는 공개로 돌리는 걸 깜빡 했다.

오늘의 삽질 기록.

첫 번째.

MFC를 가지고 Windows UI 개발을 하다 보면, 자주 접하는 매크로가 있다. 바로 ON_MESSAGE, ON_NOTIFY, ON_COMMAND, ON_REGISTERED, ON_BN_CLICKED … 기타 등등…

이 중, 사용자 정의 메시지를 처리하기 위한 핸들러를 정의할 때 사용하는 것이 바로 ON_MESSAGE 매크로다. 이 매크로는 다음과 같다.

#define ON_MESSAGE(message, memberFxn) \
	{ message, 0, 0, 0, AfxSig_lwl, \
		(AFX_PMSG)(AFX_PMSGW) \
		(static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > \
		(memberFxn)) },

결국, CWnd의 멤버 함수 포인터인데, LRESULT를 리턴 타입으로 하고, WPARAM, LPARAM 파라미터를 가진다. 그런데, 보통 LRESULT 리턴 타입으로 핸들러를 선언하기 귀찮아서(함수 구현에 return 구문도 추가해야 하고) 그냥 void 타입으로 선언하는 일이 많았다. 그러다가, Visual Studio .NET 2005인가부터 ON_MESSAGE 타입 핸들러의 리턴 값이 void로 선언되어 있으면, 컴파일 에러를 발생시켜서 이를 모두 바꿨던 기억이 난다. 이 작업을 하면서, ON_MESSAGE_VOID 라는 걸 알게 되었는데,

// like ON_MESSAGE but no return value
#define ON_MESSAGE_VOID(message, memberFxn) \
	{ message, 0, 0, 0, AfxSig_vv, \
		(AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(void))&memberFxn },

주석을 보면, ON_MESSAGE와 비슷하지만 반환 값이 없다… 정도로 알 수 있다. 오호, 그럼 이런 생각이 든다. ‘이거 쓰면, 함수에 굳이 return 처리가 필요하지 않겠군. ‘. 맞긴 맞다. 문제는… ‘반환 값이 없다’라는 것만 보고 ON_MESSAGE를 대체할 수 있다고 생각한 것이다. 택도 없다… 함수 포인터의 원형을 보면, 이 녀석은 반환 값 만이 아니라, 아예 함수 호출 시, 파라미터 자체를 받지 않는다. 이러니 아무리 WPARAM, LPARAM에 데이터를 넣어봐야… -0-

 

두 번째.

TcpSessionManager::InitializeSession(SOCKET socket)
{
	TcpSession *session = new TcpSession(socket); // 생성자에서 WSARecv를 호출한다.
	IOCPHandler::Instance()->Add(socket, session); // 소켓에 대한 IOCP 핸들 등록
 
	AutoLock<WRITE> lock(&cs);
 
	session_list.push_back(session);
 
	...
}

이 코드도 한참을 보고야 문제를 알았다. 클라이언트가 접속을 요청하면 accept하고, 이에 대한 TcpSession 생성 시점에서 WSARecv를 부른다. 일반적인 상황에서는 TcpSession 내부에서 부르는 WSARecv는 받을 데이터가 없을 것이다. 하지만, 같은 PC 내에서 테스트 하는 경우, 접속과 동시에 클라이언트가 데이터를 보냈을 때는 이 WSARecv를 통해 데이터를 받을 수 있다. 하지만, WSARecv를 통해 데이터 수신을 요청한 후, IOCP 핸들에 등록하기 때문에, 해당 WSARecv의 완료 이벤트는 받을 수가 없는 것이다.

2번째 같은 경우, 일정 수준 이상 검증을 완료한 라이브러리를 사용했을 때는 결코 나올 수 없는 부분인데… 역시 처음부터 다시 날로 만들면 꼭 이런 실수를 거친다. –0-

다음에는 그냥 boost::asio를 써버리던지 해야겠다. ACE는 솔직히 너무 복잡해서 쓰기 힘들어… 물론, boost도 쓰기 힘들다는 사람이 많아서 팀에서 쓸 수 있을지는 모르겠네.

View Comments to 오늘의 프로그래밍 삽질

Avatar

oscarplex's me2DAY

May 2nd, 2010 at 1:15 PM

오스카의 생각…

오늘의 삽질… 더 꼼꼼해질 필요가 있다….

blog comments powered by Disqus

Categories