인프런 커뮤니티 질문&답변
recv, send 리턴값 질문
해결된 질문
작성
·
22
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)
답변 2
0
송/수신 반환 크기를 반영하는 일은 매우 중요합니다. 예시로 보여준 코드처럼 작성하는 경우가 종종 있습니다만 이는 데이터 크기와 관련됩니다. 한 번에 보내려는 데이터량이 많을 경우 반환 크기를 예제 코드처럼 계측해 송신이 완료되도록 합니다. 그러나 64KB 정도 이하 데이터 정도면 송/수신 에러 정도를 확인하는 정도로 처리해도 무방합니다.
문제는 수신 입니다. 수신측에서는 수신버퍼의 크기도 중요하지만 실제로 수신하는 데이터의 크기는 수신버퍼 크기보다 작을 경우가 많기 때문에 항상 반환된 값을 확인해 데이터 수신량을 처리하는 것이 바람직합니다. 참고하시기 바랍니다. 😄
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 함수
이 게시물에서는 송수신 함수의 리턴 값에 따른 반복 호출에 대해 더욱 자세히 설명하고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






이해했습니다. 감사합니다.