본문 바로가기
Programming/C++

[C++] TCP/IP 의 window size에 대비한 처리

by ★용호★ 2015. 5. 25.
  • 소켓을 이용한 데이터 송수신시에 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

댓글