- 소켓을 이용한 데이터 송수신시에 TCP/IP를 이용하는 경우 TCP/IP에는 내부적인 윈도우 크기를 가지고 있기 때문에 한번에 원하는 양의 데이터가 전송되지 않을 수 있다. 이 TCP/IP window size는 TCP/IP에서 데이터를 처리하기 위한 구간이라고 생각하면 된다.
예를들어 2048 byte 만큼의 데이터를 전송하려고 하는데 TCP/IP window size가 1024 byte라면 전송되지 않은 1024 byte 만큼의 데이터를 재전송해주어야 한다.
char sendbuff[2048]; int nBytes = 2048; int nLeft, idx; // sendbuff에 2048 만큼 데이터를 채운다. // s는 연결된 스트림 소켓 nLeft = nBytes; idx = 0; while(nLeft > 0) { ret = send(s, &sendbuff[idx], nLeft, 0); if(ret == SOCKET_ERROR) { // Error } nLeft -= ret; idx += ret; }
수신측에서도 마찬가지로 수신받아야할 데이터의 크기보다 적은 사이즈의 데이터를 받을 수 있기때문에 같은 원리의 처리를 해주어야 한다.
하지만 TCP/IP와 같은 스트림 소켓의 데이터는 연속된 스트림 형식이기 때문에 데이터를 수신받는 응용프로그램 입장에서는 얼마만큼 데이터가 읽혀졌는지 중요하지 않을 수도 있기 때문에 비교적 간단히 처리할 수 있다.
char recvbuff[1024]; int ret, nLeft, idx; nLeft = 512; idx = 0; while(nLeft > 0) { ret = recv(s, &recvbuff[idx], nLeft, 0); if(ret == SOCKET_ERROR) { //Error } idx += ret; nLeft -= ret; }
참고 : Network Programming for Microsoft Windows, p44
'Programming > C++' 카테고리의 다른 글
[C++] define은 작성된 순서대로 수행 될까? (0) | 2015.09.10 |
---|---|
[C++] make_pair를 이용하여 데이터 관리 (0) | 2015.07.13 |
[C++] IOCP에서 패킷 처리 관련 (2) | 2014.05.10 |
[C++] inet_addr, htons 함수 (1) | 2013.04.11 |
[C++] static const에 대한 고찰 (0) | 2013.04.11 |
댓글