inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

send, recv 함수

해결된 질문

317

손태정

작성한 질문수 15

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;
}

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

socket.io udp iocp tcpip

답변 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