대학원 연구실에 들어가기 전에 프로그래밍 공부하면서 소켓 프로그래밍 공부 중입니다.


교재는 윤성우의 열혈 TCP/IP 소켓 프로그래밍 책을 보며 독학하고 있습니다.


깊이 생각하고 반성하면서 공부하진 않고 그냥 흐름 따라가면서 쭉 읽어가는 중입니다.


오랜만에 VMWare로 리눅스도 써보고 재밌네요.




소스코드를 따라 쓰고 컴파일해서 결과를 확인하고 있는데 윈도우 환경에서 컴파일 에러를 일으키는 소스 코드가 있습니다.


연습은 Visual Studio 2012로 했는데요.


2012년 출간 된 5쇄에서 p. 143 소스코드 53번 줄의 recv(hSocket, &result, RLT_SIZE, 0);와 p. 144의 47번 줄의 recv(hClntSock, &opndCnt, 1, 0); 에서 컴파일 에러 C2664가 발생합니다.


컴파일 오류가 발생하는 이유를 자세히 보시려면 MSDN의 문서를 참고하세요(링크: https://msdn.microsoft.com/ko-kr/library/s5b150wd.aspx).


컴파일 오류가 발생하는 이유를 요약하면 암시적으로 형 변환을 시도하면 안 되는데 했기 때문입니다.


함수 recv는


int recv(

 _In_  SOCKET s,

 _Out_ char   *buf,

 _In_  int    len,

 _In_  int    flags

);


위와 같은 인수를 필요로 합니다(원본 링크: https://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx).


책의 소스코드에는 2번 인수를 int형을 써서 컴파일 에러가 발생한 것입니다.


그래서 올바른 결과를 얻으려면 2번 인수에 (char *)를 추가해서 형 변환 이후에 쓰시면 됩니다.


컴파일 에러가 나지 않는 소스코드:


recv(hSocket, (char *)&result, RLT_SIZE, 0);

recv(hClntSock, (char *)&opndCnt, 1, 0);



윤성우의 열혈 TCP/IP 소켓 프로그래밍
국내도서
저자 : 윤성우
출판 : 오렌지미디어 2009.12.01
상세보기


Posted by 공돌이pooh
,