목록Today I Learn (93)
나만의 작은 도서관
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. TCPRecvBufferTCP는 바이트 스트림 형식으로 데이터가 수신되기 때문에 온전한 패킷이 다 들어왔다는 보장도, 패킷 단위로 읽는다는 보장도 없다. WSARecv 같은 경우도 인자로 넘겨준 numOfBytes의 크기도 하나의 패킷에 대한 크기가 아니다.이렇듯 각 메시지에 대해 경계를 TCP에서 알 수 없는 문제를 “메시지 경계(Boundary) 문제”라고 한다.WSARecv의 numOfBytesWSARecv를 등록하고 완료 패킷에 들어간 다음부터는 인자로 넘겨준 numOfBytes의 값은 변하지 않는다. 즉, WSARecv를 하나만 걸어줬어도 완료 패킷 이후에 데이터가 수신되었다면 numOfBytes와 실제 OS에 ..
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 여러 스레드가 하나의 소켓에 대해 send를 하려는 상황이 발생하는가?recv의 경우기본적으로 TCP 통신에서는 클라이언트-서버 구조에서 상대 호스트와 통신할 때 송신 횟수(send)가 수신 횟수(recv) 보다 많다. 왜냐하면 TCP에서의 수신은 데이터를 한 번에 가져오기 때문이다. 즉, 송신을 3번 해도, 수신 한 번으로 데이터를 전부 가져올 수 있다는 것이다.이러한 이유 때문에 하나의 소켓에 대해 수신 이벤트를 여러 개 등록하지 않고 하나만 등록해 두어도 성능이 준수하다. 어차피 OS가 관리하는 수신 버퍼가 꽉 차기 전에 가져오기만 하면 되기 때문이다.본론: send의 경우send의 경우 recv처럼 이미 존재하는 ..
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. TCP 특성으로 인한 WSARecv 사용 시 주의할 점TCP에서의 송수신 데이터는 경계가 존재하지 않는다. 즉, CP에 등록한 소켓으로부터 데이터가 수신되었다는 것이 클라이언트가 보낸 데이터가 전부 도착했다는 의미가 되진 않는다. 그림으로 표현하자면 아래와 같다.// Client가 데이터 A -> 데이터 B 순서로 Server에게 보냄// Server의 OS 수신 버퍼의 경우의 수// 1. A의 일부만 도착: [OOOOOOOOO____]// 2. A가 전부 도착: [OOOOOOOOOOOO]// 3. A + 일부 B 도착: [OOOOOOOOOOOOO][OOOOOOO_______]WSARecv는 해당 소켓으로부터 데이터가 수..
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. enable_shared_from_this를 사용할 때 주의할 점enable_shared_from_this는 상속받을 경우, T타입의 this를 스마트 포인터로 사용할 수 있도록 하는 함수 2개를 사용할 수 있게 된다. 여기서 주의할 점은 enable_shared_from_this를 상속받은 클래스를 상속받은 클래스에서 shared_from_this()와 같은 함수를 사용할 때이다.class Base : public enable_shared_from_this{//...}class Derived : public Base{//...}위 코드에서 Derived는 Base를 상속받았기 때문에 shared_from_this()와 ..
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. Scatter-Gatherscatter-gather란 데이터를 송신할때 송신할 데이터를 모아서 한 번에 보내는 방법을 말한다.scatter-gather 방식을 사용하는 이유: 너무 잦은 시스템콜 호출 방지시스템 콜은 프로세스(또는 쓰레드)가 OS에게 서비스(파일 열기, 메모리 할당, 소켓 통신 등)을 요청하는 공식적인 인터페이스로, 시스템 콜 요청시 CPU는 해당 쓰레드를 사용자 모드 → 커널 모드로 전환한다. (즉, 시스템 콜은 다른 쓰레드에게 작업을 위임하는 것이 아니라, 동일한 쓰레드가 더 높은 권한을 일시적으로 얻어서 작업을 수행하는 것!)비동기 입출력 함수들은 시스템콜 방식으로 함수를 호출하며, 시스템콜 함수의 ..
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 다시 정리하는 IOCP 함수IOCP 함수는 크게 3가지로, CICP, GQCS, PQCS가 있다. 이 3가지 함수를 통해 IOCP의 대부분의 기능을 사용할 수 있다. (여기서 PQCS는 따로 다루지 않는다.)CICP 함수CreateIoCompletionPort(1, 2, 3, 4)비동기 I/O 소켓 핸들: 클라이언트 소켓을 HANDLE로 캐스팅해서 넣는다.IOCP핸들: 만들어진 IOCP의 핸들을 넣는다.키: 연결한 장치에 대한 고유 키를 넣는다. 아무거나 넣어도 되지만 보통 해당 클라이언트 소켓의 세션 주소를 넣는다.CP 처리 쓰레드 개수: CP에 접근하는 최대 쓰레드 수를 지정한다. 0으로 설정하면, 기본값으로 프로세서..