WSASend() 에서 갑자기 Error code ‘6’을 리턴한다.

어느날 갑자기 잘 돌아 가던 코드가 장애를 일으킨다. 분명히 어제까지 잘 동작하던 코드인데….

소스 코드를 한달전까지 롤백도 해보고 별짓을 다했는데 안된다.

MSDN 을 수 없이 뒤져도 잘 모르겠다.

디버깅에 디버깅을 계속하다가 WSASend의 6번째 파라미터에 우연히 마우스 커서가 갔다.
순간 표시되는 COVERLAPPED * 구조체의 overlapped 멤버의 값이 0xdddddddd 이다.

아차 하는 느낌도 있었지만 그동안 잘돌기는 했는데….
혹시나 하는 마음에 아래와 같이 초기화를 해보았다.

.h 선언
	COverlapped		m_SendOV;
	COverlapped		m_RecvOV;	

.cpp 구현
	memset(&m_RecvOV, 0, sizeof(m_RecvOV));
	memset(&m_SendOV, 0, sizeof(m_SendOV));

ㅎㅎㅎㅎㅎㅎㅎ

참~~~
허탈하다….

그동안은 왜 잘동작했을까?
Windows 를 업그레이드 하면서 MS가 값의 검사를 좀더 꼼꼼하게 한 모양입니다.
error no 6 은 잘못된 핸들인데 소켓이 잘못된 것이라는 메시지로 잘못 인식한 것이죠. 여기서 잘못된 핸들은 초기화가 없어서 쓰레기값이 설정된 overlapped의 hEvent handle 이었던 것입니다. 또 한번 크게 느끼지만 초기화는 잘해야 할 것 같습니다.

그렇게 안보이던 초기화 관련된 내용이 이젠 보이네요. ㅎㅎㅎ
혹시라도 초기화가 빠진 부분이 있는지 다시 전체 소스를 검토하는 계기가 되었습니다.

저와 같은 실수 하지 마세요 ~~~

This entry was posted in Window Program and tagged . Bookmark the permalink.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다