Coding Memo

[winsock] getpeername 호출 시, WSAENOTCONN(10057) 에러 본문

Language/C++

[winsock] getpeername 호출 시, WSAENOTCONN(10057) 에러

minttea25 2024. 5. 23. 20:16

문제

 

소켓이 연결이 되었음에도 불구하고, getpeername() 함수가 SOCKET_ERROR를 반환하고, WSAGetLastError() 값이 10057(WSAENOTCONN)이었다.

 

해당 소켓에 대해 WSASend 및 WSARecv는 정상적으로 작동하였고, getsockname또한 정상적으로 작동하였다.


 

해결

 

연결된 소켓에 대해 SO_UPDATE_CONNECT_CONTEXT  옵션을 설정해 주면 된다.

이후 getpeername은 정상적으로 작동하고, remote endpoint의 주소와 포트 번호를 가져올 수 있다.

 


설명

 

SO_UPDATE_CONNECT_CONTEXT는 소켓이 연결 된 이후에, 소켓의 속성을 업데이트하는 옵션이다. 이 옵션은 ConnectEx, WSAConnectByList, WSAConnectByName 함수를 사용했을 때 사용된다.

 

특히, getpeername, getsockname, getsockopt, setsockopt, shutdown 함수들을 호출 할 시에, 이전에 반드시 설정이 되어야 한다.

 

다른 일반적인 Connect 메서드들과는 달리, ConnectEx는 소켓의 연결 상태를 반영하기 위해 소켓의 상태를 자동으로 업데이트 하지 않는다. (연결과 업데이트가 동시에 일어나지 않는다.) ConnectEx는 시스템에서 완전히 연결되어 있지 않는 것처럼 보이는 상태로 소켓을 남겨두기 때문에 명시적인 업데이트가 필요하다. 업데이트 하지 않을 경우, 소켓에 완전한 연결 정보가 없기 때문에, getsockname 및 getpeername, setsockopt와 같은 함수들이 제대로 작동하지 않는다.

 

 

유의할 점

  1. 소켓 수준은 SOL_SOCKET 이다.
  2. 해당 소켓이 연결이 되어 있는 상태어야 한다.
    (연결 전에 호출 시, SOCKET_ERROR를 반환하고 1103이라는 이상한 에러를 보게 될 것이다.)
  3. Optval 타입이 DWORD(boolean) 값이긴 하지만, 실질적으로 true로 설정하든 false로 설정하든 상관 없다.
    따라서 아래의 코드가 가능하다.
::setsockopt(socket, SOL_SOCKET, SO_UPDATE_CONNECT_CONTEXT, nullptr, 0)

References

 

- https://learn.microsoft.com/en-us/windows/win32/winsock/sol-socket-socket-options

 

SOL_SOCKET Socket Options (Winsock2.h) - Win32 apps

The following tables describe SOL\_SOCKET socket options. See the getsockopt and setsockopt function reference pages for more information on getting and setting socket options.

learn.microsoft.com

-  https://stackoverflow.com/questions/60591081/getpeername-always-fails-with-error-code-wsaenotconn

 

getpeername() always fails with error code WSAENOTCONN

I'm trying to use getpeerinfo to ensure i can get peer info after connecting. It fails with: WSAENOTCONN (10057) Socket is not connected. A request to send or receive data was

stackoverflow.com

 

'Language > C++' 카테고리의 다른 글

std::filesystem  (0) 2024.09.19
dllexport / dllimport (MSVC)  (0) 2024.09.04
[C++] Concurrent 우선순위 큐 (with lock)  (0) 2024.05.13
const 포인터 캐스팅 (const_cast)  (0) 2024.05.02
[에러?] the template instantiation context ~  (0) 2024.04.24