[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 |