강의

멘토링

커뮤니티

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

cheoljun99님의 프로필 이미지
cheoljun99

작성한 질문수

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

프로토콜이 적용된 파일 송신 서버 제작 (예제 포함)

recv, send 리턴값 질문

작성

·

4

0

 안녕하세요 강사님 send, recv함수 질문 있습니다. send, recv의 반환 값이 인자로 보낸 send혹은 recv하고자 하는 데이터의 크기와 항상 똑같지 않은 것은 다른 분이 남긴 질문을 보고 이미 알고 있습니다.

 

제가 궁금한것은 그래서 실무에서는 해당 recv와 send를 어떻게 사용하는 지 궁금합니다.

recv,send의 반환값을 확인해서 내가 받고자하는 혹은 내가 보내고자 하는 크기 보다 작은 경우 다시 send나 recv를 하는게 맞을까요?

그렇다면 저라면 do while 문에 send나 recv를 넣어서 사용할 것 같은데 실무에서도 아래의 코드 방식으로 send와 recv를 사용하나요?

int result;
do{
   result = send(...);
} while(result<expected)

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. cheoljun99님.

send와 recv 함수의 리턴 값에 대한 궁금증을 가지셨군요. 두 함수는 모두 네트워크 통신에서 중요한 역할을 하며, 데이터를 송수신하는 과정에서 한 번의 함수 호출로 원하는 크기의 데이터를 모두 전송하거나 수신하지 못할 수 있습니다. 이것은 특히 네트워크 환경이나 버퍼의 크기에 따라 달라질 수 있습니다.

실무에서는 일반적으로 send와 recv를 사용할 때 반복문을 사용하여 원하는 크기만큼의 데이터를 모두 처리할 수 있도록 합니다. 말씀하신 것처럼 do-while 문을 사용하는 방식은 매우 일반적입니다. 다음과 같은 예제로 이해를 도울 수 있습니다:

int totalSent = 0;
int bytesLeft = dataSize;
int n;

while (totalSent < dataSize) {
    n = send(sock, buf + totalSent, bytesLeft, 0);
    if (n == -1) { break; }
    totalSent += n;
    bytesLeft -= n;
}

// Here, totalSent should be equal to dataSize if all bytes were sent successfully.

위 코드에서는 데이터가 모두 전송될 때까지, 송신한 바이트 수를 추적하고 반복적으로 send를 호출합니다. recv도 마찬가지로 할 수 있습니다.

이와 관련해 더 많은 정보를 알고 싶다면 유사한 질문을 참고해 보세요:
- send, recv 함수

이 게시물에서는 송수신 함수의 리턴 값에 따른 반복 호출에 대해 더욱 자세히 설명하고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

cheoljun99님의 프로필 이미지
cheoljun99

작성한 질문수

질문하기