목록분류 전체보기 (338)
나만의 작은 도서관
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. Service에서 SessionFactory의 필요성SessionFactory란 세션을 만드는 하나의 공장으로, 호출 시 세션을 반환한다.using SessionFactory = function;위 코드에서 알 수 있듯, SessionFactory는 단순한 functor를 using으로 이명을 붙여준 것이다. 그렇다면 SessionFactory를 따로 만들어서 Session을 생성하는 것일까? 그냥 Session 클래스를 객체화하여 사용하면 되는 것이 아닌가?SessionRef Service::CreateSession(){ // 각 하위 서비스가 등록한 sessionFactory로 // 세션을 생성 및 반환한다. Ses..
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. Accept이벤트를 미리 걸어준다면 어떤 정보를 미리 넘겨줘야 할까?현재 사용하고 있는 Accept이벤트는 동기적으로 새로운 연결이 감지될 때까지 기다리지 않고, 미리 등록한 Accept 이벤트를 CP의 완료 패킷을 통해 통지받는다. 그렇다면 GQCS를 통해 완료 패킷을 받은 경우 어떠한 정보를 알고 있어야 할까?Accept를 미리 등록한 스레드와 Accept 이벤트에 대한 완료 패킷을 받은 스레드는 다르다(운이 좋으면 같을 수도 있다). 그래서 등록 시에 미리 넘겨줘야 하는 정보들이 있는데, 다른 네트워크 이벤트가 그랬듯이 OVERLAPPED 구조체를 확장하여 추가 정보를 넘겨주는 방식을 사용한다.원점으로 돌아와서 결국..
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 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()와 ..