C++/Win32

[Win32] 네트워크 메시지 경계 처리 - Length Prefix

powergirl 2025. 12. 27. 15:12
[4바이트 길이][실제 데이터]

 

 

recvAll
int recvAll(SOCKET sock, char* buf, int totalSize)
{
    int received = 0;

    while (received < totalSize)
    {
        int ret = recv(
            sock,
            buf + received,
            totalSize - received,
            0
        );

        if (ret <= 0)
        {
            return -1; // 연결 종료 or 오류
        }

        received += ret;
    }

    return received;
}

 

 

recv(
    sock,                  // 어느 소켓에서
    buf + received,        // 버퍼의 "다음 빈 자리"
    totalSize - received,  // 아직 필요한 양
    0
);

 

recv 시나리오

100바이트 요청 >> 실제로는 40바이트만 옴

recv #1 >> 40바이트
recv #2 >> 60바이트

그래서 누적 수신이 필요함

 

buf + received
buf 시작 주소
↓
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]  ← totalSize 만큼

 

첫 번째 recv
received = 0;

recv(sock, buf + 0, totalSize - 0, 0);

 

결과

[ A ][ B ][ C ][ D ][ ][ ][ ][ ][ ][ ]

buf[0]부터 채움

 

두 번째 recv
received = 4;

recv(sock, buf + 4, totalSize - 4, 0);

 

결과

[ A ][ B ][ C ][ D ][ E ][ F ][ G ][ H ][ ][ ]

 

 

만약,

received = 4;

recv(sock, buf, totalSize, 0);

이랬으면

[ E ][ F ][ G ][ H ][ ][ ][ ][ ][ ][ ]

기존 데이터를 덮어썼을 것

 

 

 

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

[Win32] IOCP 서버  (0) 2025.12.27
[Win32] select 서버  (0) 2025.12.27
[Win32] 서버 확장 : Thread 도입  (0) 2025.12.27
[Win32] Windows Socket 기초 - recv 무한 대기 방지  (0) 2025.12.27
[Win32] Windows Socket 기초 - TCP 연습  (0) 2025.12.27