목록winsock (8)
Coding Memo
문제 소켓이 연결이 되었음에도 불구하고, getpeername() 함수가 SOCKET_ERROR를 반환하고, WSAGetLastError() 값이 10057(WSAENOTCONN)이었다. 해당 소켓에 대해 WSASend 및 WSARecv는 정상적으로 작동하였고, getsockname또한 정상적으로 작동하였다. 해결 연결된 소켓에 대해 SO_UPDATE_CONNECT_CONTEXT 옵션을 설정해 주면 된다.이후 getpeername은 정상적으로 작동하고, remote endpoint의 주소와 포트 번호를 가져올 수 있다. 설명 SO_UPDATE_CONNECT_CONTEXT는 소켓이 연결 된 이후에, 소켓의 속성을 업데이트하는 옵션이다. 이 옵션은 ConnectEx, WSAConnectByList, WSA..
상황 GetQueuedCompletionStatus()가 성공적으로 완료되었음에도 불구하고, Overlapped 구조체의 값이 이상했다. (기대했던 값이 아니었다.) GetQueuedCompletionStatus를 호출한 HANDLE에 `connectEvent`라는 overlapped를 상속하는 구조체가 연결되어 있는 파일 핸들을 등록했다. 따라서 GetQueuedCompletionStatus가 성공적으로 완료되었다면, 인자로 넣어주었던 LPOVERLAPPED*가 이 connectEvent를 가리키는 포인터가 되어야 된다. 그러나 이 포인터는 메모리 오염이 일어난 듯 값이 이상했다. 먼저, IOCPEvent와 ConnectEvent는 다음과 같다.// EventType은 unsigned ..
문제 상황은 내 개인적인 상황에 해당한다. 엄청 복잡한 문제는 아니지만, 같은 문제를 발생시키는 일이 없도록 기록하려고 작성했다. (계속 추가...) ConnectEx - WSAEINVAL (10022) 에러 내용: ConnectEx를 호출할 소켓이 바인딩 되어 있지 않거나 수신 대기 중일 때 발생 문제 상황: ConnectEx 호출 시 발생한 에러 에러 이유: ConnectEx의 첫번째 인자인 소켓이 bind되어 있지 않은 소켓이어서 나타난 에러 해결: ::bind()를 통해 소켓에 로컬 주소와 포트를 바인딩 해준 후, ConnectEx함수를 호출했음 참고: https://learn.microsoft.com/ko-kr/windows/win32/api/mswsock/nc-mswsock-lpfn_conne..
에러 내용 ::WSAGetLastError()로 얻은값이 10022 (WSAEINVAL)값으로 에러가 발생했다. 나의 경우 ConnectEx함수 호출 후, 위 에러가 나타났다. 찾아보니 인수가 잘못되었다는 에러였는데, 도대체 여러개의 인자들 중 무엇이 잘못되었는지 몰라서 당황했다. (필요한 인자가 nullptr도 아니었고, 잘못된 인자가 없었다.) ConnectEx 문서를 보니 바로 이유를 알게 되었다... 해결 ConnectEx에 사용하는 소켓은 반드시 바인딩 되어 있어야 한다. ConnectEx 호출 이전에 소켓에 ::bind를 통해 나중에 연결에 사용될 로컬 주소와 포트를 바인딩해주면 된다. 추가적으로 소켓에 대한 유의 사항을 정리하면 소켓은 바인딩되어 있어야 한다. (주의할 점은 연결 할 엔드포인..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 지금까지 했던 socket은 blocking으로 작동하는 소켓이었다. accept : 접속한 클라이언트가 있을 때 connect : 서버가 접속에 성공했을 때 send, sendto : 요청한 데이터를 sendBuffer에 복사 했을 때 recv, recvfrom : recvBuffer에 도착한 데이터가 존재하고, 이를 유저레벨 buffer에 복사했을때 다음 코드가 실행이 된다. 다시 말해, 위 조건이 실행되거나 에러가 발생할 때까지 다음 코드 실행은 block되는 것이다. 곰곰히 생각해보면 서버를 실행할 때 어떤 송수신이나 connect에 대한 응답을 무한히 대기하여 block된 상태로 있을 수는 없을 것이다..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. socket을 만들고 이 소켓에 대한 여러가지 세팅을 해줄 수 있다. 다음의 함수를 이용한다. setsockopt() int setsockopt( [in] SOCKET s, [in] int level, [in] int optname, [in] const char *optval, [in] int optlen ); SOCKET s 설정을 할 타켓 소켓 int level 옵션이 정의될 레벨 (SOL_SOCKET 이용) int optname 설정할 옵션 이름 const char* optival 설정할 옵션의 값 int optlen 설정할 옵션의 값의 크기 char*로 옵션의 값을 받는 이유는 옵션에 대한 값을 여러가지..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. UDP(User Data Protocol)은 네트워크 5계층에서 Transmission Layer에 해당하는 프로토콜 중 하나의 방식이다. UDP는 다음과 같은 특징이 있다. 1. 연결을 위한 별다른 경로가 없다. 2. 송수신 여부를 확인하지 않는다. 3. 데이터 손실에 대한 조치가 없다. 4. 데이터 그램 단위로 데이터를 전송한다. 5. 속도가 상대적으로 빠르다. (TCP에 비해) 좀 더 자세히 보자면 1. 연결을 위한 즉, listening 할 소켓이 필요가 없다. 대신 connecting UDP가 있다. (즐겨찾기와 비슷) 2. 직접적인 연결을 송수신 자간에 따로 하지 않고 송수신 여부도 따로 확인하지 않..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 소켓을 이용해서 간단하게 서버와 클라이언트 접속을 해보도록 하자. 소켓 프로그래밍을 위해서는 다음과 같은 라이브러리와 헤더가 추가되어야 한다. (아래 문서에도 나와있다.) (https://learn.microsoft.com/ko-kr/windows/win32/winsock/creating-a-basic-winsock-application) #include #include #include #pragma comment(lib, "ws2_32.lib") MS에서 제공하는 윈도우 소켓을 이용한다. 자세한 문서는 아래에 있다. https://learn.microsoft.com/ko-kr/windows/win32/wins..