인프런 커뮤니티 질문&답변

손태정님의 프로필 이미지
손태정

작성한 질문수

Windows 소켓 프로그래밍 입문에서 고성능 서버까지!

멀티스레드 에코 서버 (예제 포함)

send, recv 함수

해결된 질문

작성

·

251

·

수정됨

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는 혼잡제어 및 연결지향 프로토콜입니다. 상대가 수신할 여유가 안 되면 보내지 않는 것이 특징입니다. 참고하시기 바랍니다.

손태정님의 프로필 이미지
손태정

작성한 질문수

질문하기