-
C++ 서버 프레임워크 제작 중 연산자 재정의로 인해 발생한 버그프로그래밍/의문 2015. 5. 23. 23:20반응형123456789101112131415161718void User::Receive(){DWORD recvBytes;DWORD flags = 0;SOCKET s = m_socket;auto bytesTransferred = WSARecv(m_socket,//m_socket.GetNativeSocket(),&m_receiveBuffer.wsaBuffer,1,&recvBytes,&flags,&m_overlapped,NULL);// ...}
cs 문제는 저 부분이었다. m_socket.
여기서 m_socket의 정의는 Nelta::StreamSocket m_socket이다. StreamSocket은 윈도우 소켓을 다루는 게 서툴렀던 내가 TCP 소켓을 좀 더 간편하게 사용하고자 래핑한 클래스이다. 여기서, 소켓이 유효한 소켓인지 체크를 하기 쉽게 하기 위해
1234567891011class User{// ...int m_hostId;Nelta::StreamSocket m_socket;PacketBase m_receiveBuffer;PacketBase m_sendBuffer;OVERLAPPED m_overlapped;//...};cs StreamSocket listenSocket = socket(…);
그러니까, if( listenSocket ) 이런식으로 소켓이 유효한지에 대한 검사를 쉽게 하기 위해 bool 연산자를 재정의 했었는데 이게 SOCKET으로 캐스팅이 되었을 때 bool로 캐스팅이 되어 소캣 값이 1 또는 0으로 되었었던 것이다. 언젠가 다른 언어에는 연산자 재정의가 문제가 있을 여지가 있다고 생각해 구현화하지 않았다는 말을 언뜻 보았던 기억이 있는데 나는 저 문제를 잡기 위해 꽤 많은 시간이 들어갔다. 결론은 bool 연산자 재정의를 valid 함수로 빼버리고 SOCKET 캐스팅 연산자도 지워버릴까 한다 남겨두는 연산자 재정의는 =에 대한 것만 두던가 할 생각.
반응형'프로그래밍 > 의문' 카테고리의 다른 글
수신 오류로 착각한 송신 오류 (0) 2015.06.10 서버 코딩 중 있었던 수신 직후 소켓이 닫히던 버그 (0) 2015.05.25 컴파일러 경고 warning C4127 (0) 2015.03.20 코딩 스타일은 개발자의 지문 (0) 2015.02.12 32비트 OS(운영체제)에서 64비트 OS로 바꾸면 성능이 꼭 향상만 될까? (0) 2015.02.04