none
[Tip] 소켓 에러 10038 이 무엇인가요? RRS feed

  • 질문

  • 안녕하세요 갱주니입니다. 오래간만에 MSDN 포럼에 글을 하나 올리네요 최근에 메일로 아래와 같이 문의가 왔습니다.

    좋은 내용인것 같아서  MSDN 포럼에 올려 놓습니다.

     

    -------------------------------------------------------------------------------------------------------------

     

    죄송하지만 한가지 여쭤보고자 메일을 보냅니다...

     

    저는 뒤늦게 프로그래밍을 한 초보자로...
    졸업작품을 하다 어쩌다보니 서버를 하게 되었습니다..
    처음부터 짠 소스는 아니고 작년 선배님이 하신 소스를 보면서 하고 있었는데 소켓에러로 10038가 나게 되어
    검색을 하다가 한 게시물을 보고 궁금증이 생겨서 메일을 보내게 되었습니다.. (__);;

     

    궁금한 게시물 부분은 프로그래밍(삽질) 탭에 IOCP사용방법(2) 심화학습이며
    [http://blog.naver.com/process3/20022555677]

     

    IOCP 사용하기 위한 절차 5번 완료된 작업에 대해 해야 할 일을 한다. 에 코드로 6번째줄


    if(GetLastError() == 10038)
    continue;

    부분에 10038이 나게 되면 그냥 지나가게 처리되어 있는데

     

    왜 이렇는지 의문이 나서 메일을 보내게 되었습니다...

     

    답변 입니다.

     

    WSAENOTSOCK (10038) Socket operation on non-socket.

    Berkeley description: An operation was attempted on something that is not a socket. The specified socket parameter refers to a file, not a socket.

    버클리 소켓 설명 : 소켓이 아닌곳에 동작을 시도한다. 특정 소켓 파라미터가 파일이다. 소켓이 아니다(직역했는데 더 이해가 안되네요 ㅠㅠ)

     

    WinSock description: Same as Berkeley. The socket input parameter is not a valid socket handle (either it never was valid, it's a file handle (not a socket handle), or if it was a socket handle, it has been closed).

    윈도우 소켓 설명 : 버클리와 같다. 이 소켓 파라미터 값이 유효한 소켓 핸들이 아니다. (그리고 이것은 절대 유효하지 않다. 이것은 파일 핸들이다. (소켓 핸들이 아니다) 또는 이것은 소켓 핸들이지만 이미 닫힌 핸들이다.)

     

    Detailed description:

    select(): fails with WSAENOTSOCK if any socket in an fd_set is an invalid socket handle.

    Developer suggestions: Did you close a socket inadvertently in one part of an application without keeping another part notified? Use socket state in an application and/or handle this error gracefully as a non-fatal error.

    WinSock functions: Any function that takes a socket as an input parameter: accept(), bind(), closesocket(), connect(), getpeername(), getsockname(), getsockopt(), ioctl socket(), listen(), recv(), recvfrom(), select(), send(), sendto(), setsockopt(), shutdown(), FD_CONNECT

    Additional functions: WSAAsyncSelect() should be in the list of functions (some applications might not register for or handle the FD_CONNECT message).

     

    위에 빨간색으로 적은 것 때문입니다. 즉, 이미 닫은 소켓을 다시 닫을려고 하는 경우에 대해서 처리하기 위함이죠.

    솔직히 좋은 코드는 아닙니다. 그러나 대형 콘텐츠를 개발하다보면 예를 MMORPG서버(멀티 스레드 프로그램이죠ㅠㅠ 모든 악의 근원 잘못 설계된 멀티스레드 프로그램ㅠㅠ)를 개발하다 보면 소켓 핸들을 이미 닫았는데 다시 닫을려고 하는 경우가 있습니다. 이러한 경우를 대비하기 위함입니다. 즉. 이러한 경우가 발생하지 않게 일괄되게 소켓 핸들을 관리하도록 프로그램을 개발하는게 정답입니다.

     

    2009년 11월 3일 화요일 오전 8:23