• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    해결됨

send, recv 함수

23.09.08 17:51 작성 23.09.08 17:53 수정 조회수 186

0

char buf[] = "data";
int sendSize = 0;
int total = 0;
while ((sendSize = send(socket, buf + total, sizeof(buf) - total, 0) > 0
      && total < sizeof(buf))
{
  total += sendSize;
}

데이터를 송수신할 때 송수신 함수는 주고받고 싶은 만큼의 데이터가 모두 전달되지 않더라도 완료될 수 있으니까
데이터를 송수신할 때는 한 번의 함수호출이 아닌 위와 같이 여러 번의 함수호출로 완전한 데이터 송수신을 하는 게 맞나요??
(코드는 송신할때의 상황이지만 수신도 서로 약속한 길이의 데이터를 주고받을 때 마찬가지인지 궁금합니다.)

답변 1

답변을 작성해보세요.

1

항상 그런 것은 아닙니다. 특히 지금 예제처럼 겨우 4바이트 가량의 데이터를 반복할 이유는 없습니다. 그러나 파일 송신처럼 대량의 데이터를 보내는 경우라면 반복문을 이용하는 것이 맞겠습니다. 그리고 수신의 경우도 마찬가지 입니다. 원하는 데이터가 다 수신 되지 않았다면 반복하는 것이 일반적입니다.

그러나 간혹 아예 그런 상황을 고려하지 않고 소켓을 끊어버리는 것으로 대응하기도 합니다.

정답이 있는 것은 아닙니다. 작성하는 프로그램의 요구조건과 운영환경을 고려해 결정하면 되겠습니다. 그리고 꼭 고려해야 할 것은 송신을 요청 시 명시한 용량과 실제 보내진 데이터 량이 다를 경우 송신자의 문제가 아니라 수신측의 문제일 수 있다는 점을 함께 생각해야 합니다. TCP는 혼잡제어 및 연결지향 프로토콜입니다. 상대가 수신할 여유가 안 되면 보내지 않는 것이 특징입니다. 참고하시기 바랍니다.