소켓 프로그래밍
Winsock/C++ 비동기 연결 요청 함수 ConnectEX
Winsock/C++ 비동기 연결 요청 함수 ConnectEX
2022.02.20SOCKET SOCK= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //상대 쪽에 고지할 IP와 포트를 설정. sockaddr_inMyAddress= { 0 , }; MyAddress.sin_addr.S_un.S_addr= ADDR_ANY; MyAddress.sin_family= AF_INET; MyAddress.sin_port= 0; bind(SOCK, (const sockaddr*)&MyAddress, sizeof(MyAddress)); //완료 통지를 받을 소켓을 IOCP에 등록한다. CreateIoCompletionPort(SOCK, hCompletionPort, (ULONG_PTR)SOCK, 0); //ConnectEx 함수 포인터를 얻어온다. GUID guid ..
Winsock/C++ - IOCP 종료처리 관련
Winsock/C++ - IOCP 종료처리 관련
2022.01.101. closesocket 이후에 OS는 closesocket 의 인자로 전달했던 것과 같은 값을 가지는 핸들을 리턴할 수 있다. closesocket은 TCP 단에서의 연결종료 루틴의 수행 뿐 아니라 핸들을 반납하는 역할 또한 수행한다. closesocket이후 OS는 같은 핸들을 반환할 수 있는데, IOCP의 경우 멀티스레드로 사용하는 경우가 대부분이기 때문에 동기화 문제가 발생할 가능성이 크다. 따라서, closesocket을 두번이상 호출하는 것은 위험성을 가지며, closesocket을 호출하기 전에는 해당 소켓 핸들에 더이상 접근이 없음을 확실시 해야 한다. 2. 1Recv 1Post 가 가장 보편적이고 가장 편리하고 가장 깔끔하다. (수신하고 - Post 를 반복한다.) 수신에 대한 완료 통..
Winsock/C++ - 4. setsockopt, getsockopt, WSAIoctl
Winsock/C++ - 4. setsockopt, getsockopt, WSAIoctl
2022.01.04[프로그래밍/소켓 프로그래밍] - Winsock - 1. WSAGetLastError, FormetMessage [프로그래밍/소켓 프로그래밍] - Winsock - 2. TCP 연결 bind,listen,accept 그리고 connect [프로그래밍/소켓 프로그래밍] - Winsock - 3. 데이터 송수신 send, recv 운영체제는 다양한 소켓 옵션등을 제공한다. winsock을 사용하는 App은 소켓 옵션을 사용해 소켓의 동작방식을 제어할 수 있다. 기본적으로는 TCP등 네트워크 프로토콜의 동작방식과 밀접한 관련이 있으나, 그렇지 않은 옵션도 있다. OS 자체의 전역적 네트워크 옵션과 정책에 따라 다르게 동작할 수 있다. 옵션 설정에는 setsockopt 함수가 사용된다. optval은 포인터를 ..
Winsock/C++ - 3. 데이터 송수신 send, recv
Winsock/C++ - 3. 데이터 송수신 send, recv
2022.01.03Winsock - 1. WSAGetLastError, FormetMessage https://so-what-93.tistory.com/42 Winsock - 2. TCP 연결 bind,listen,accept 그리고 connect https://so-what-93.tistory.com/43 연결이 되었으니 데이터 송수신을 진행해 보기로 한다. 송수신은 send와 recv를 이용한다. send와 recv는 사용법이 보이듯이 매우 간단하다. 사용법은 매우 간단하다. send가 보내는 함수라고 생각할 수 있고, recv가 받는 함수라고 생각할 수 있다. 허나 실제적인 동작은 어디까지나 송수신 커널 버퍼에 대한 복사 작업이다. send 함수의 경우, 커널의 송신 버퍼에 buf의 내용을 len 만큼 카피한다. 송..
Winsock/C++ - 2. TCP 연결 bind,listen,accept 그리고 connect
Winsock/C++ - 2. TCP 연결 bind,listen,accept 그리고 connect
2022.01.03TCP 연결을 위해서는 우선 포트를 LISTENING 상태로 만들어야 한다. 그래야 TCP 간 3way hand shake를 진행할 수 있다. 이는 netstat -a 로 확인이 가능하다. 소켓을 이용해 구현할 때에는 다음과 같이 진행한다. 매우 간단하다. 1. 소켓을 생성한다. 2. 만들어진 소켓에 주소를 매핑시킨다. 3. listen을 호출한다. 이러면 해당 주소( 해당 소켓) 은 LISTENING 상태가 된다. SOCKET ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //AF_INET -> 주소체계 //SOCK_STREAM-> TCP 전송방식 //IPPROTO_TCP-> IPv4 헤더 안에 6이 입력됨. 소켓을 만들때에는 socket 함수를..
Winsock/C++ - 1. WSAGetLastError, FormetMessage
Winsock/C++ - 1. WSAGetLastError, FormetMessage
2022.01.03WSA(Windows Socket API)에서 소켓작업 실패시 WSAGetLastError로 이를 얻어 올 수 있다. 이 에러코드는 전역변수가 아니라 TLS(Thread Local Storage) 에 저장된다. 이 함수는 각 스레드가 저마다 에러코드를 저장한다는 것. 그러니 에러가 발생한 컨텍스트를 수행중인 스레드의 에러코드가 다른 스레드에 의해 오염될 일은 걱정하지 않아도 된다. 얻어온 에러코드는 MSDN을 통해 정보를 확인한다. https://docs.microsoft.com/ko-kr/windows/win32/winsock/windows-sockets-error-codes-2 Windows 소켓 오류 코드 (Winsock2. h) - Win32 apps Windows WSAGetLastError 함..
Winsock - 소켓 송수신 버퍼 사이즈 대체 어떻게 해야하나?
Winsock - 소켓 송수신 버퍼 사이즈 대체 어떻게 해야하나?
2021.12.01winsock을 다루는 많은 서적에서 SO_SNDBUF를 0으로 맞추면 send 시에 커널 버퍼에 카피를 하지 않기 때문에 성능에 이득이 된다고 한다. 하지만 실제로는 0로 맞춘다고 해도 복사가 일어난다. 아래의 msdn을 참고. https://docs.microsoft.com/en-us/troubleshoot/windows/win32/data-segment-tcp-winsock You can change the amount of Winsock kernel buffer allocated to the socket using the SO_SNDBUF option (it's 8K by default). If necessary, Winsock can buffer more than the SO_SNDBUF buf..