send, recv 함수
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는 혼잡제어 및 연결지향 프로토콜입니다. 상대가 수신할 여유가 안 되면 보내지 않는 것이 특징입니다. 참고하시기 바랍니다.
recv, send 리턴값 질문
0
77
2
스타,워크와 같은 디스창 (Disconnected)도 비정상 종료에 대응하는 시스템으로 봐야할까요?
0
96
2
수업과 관련해서 읽어볼 만한 책 있나요?
0
111
1
서버가 끊어버리는것에 대한 질문
0
121
2
TCP 의도적 장애 테스트 질문
0
159
2
shutdown()을 호출하는 이유
0
165
1
프로토콜이 적용된 파일 송신 서버에서 send, recv 질문 있습니다!
0
153
2
"파일 송신 서버 제작" 강의 질문입니다!
0
151
2
대표적인 장애 유현 2
0
131
2
대표적인 TCP 장애 유현
0
161
2
이벤트 기반 파일 입출력과 callback 기반 파일 입출력이 네트워크에도 쓰이는 기법인가요?
0
120
2
개발환경 질문이 있습니다.
0
137
1
TCP/IP vs UDP , 멀티 스레드에서의 병목 현상에 대한 질문이 있습니다!
0
221
2
메모리 관련 문제로 질문드립니다.
0
187
2
테스트 환경 질문드립니다!
0
168
2
ThreadAcceptLoop 의 우아한(?) 종료에 대해 질문드립니다.
0
419
2
하트비트 시 서버에서의 연결 종료
0
451
2
강사님 질문 드립니다.
0
249
1
소켓 입/출력 설계 정리
0
450
1
멀티스레드 기반 서버 관련 질문..!
0
412
2
빅 엔디언과 리틀 엔디언
0
378
2
TIME_WAIT 관련 문의드립니다.
0
226
1
강사님 강의자료 인쇄용으로 부탁드립니다.
0
288
1
bind 함수 관련 궁금증
0
357
2





