인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

HMiso님의 프로필 이미지

작성한 질문수

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

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

프로토콜이 적용된 파일 송신 서버에서 send, recv 질문 있습니다!

해결된 질문

작성

·

56

0

안녕하세요 널널한 개발자님! 언제나 강의 잘보고 있습니다.
예제 소스 코드 보고 있는데 의문이 생겨서 이렇게 질문드립니다.

이전 강의에서 recv와 send는 1:1로 매칭되지 않는다라고 하셨었는데

프로토콜이 적용된 파일 송신 서버 제작 강의 예제를 보면 MYCMD 나 GETFILE 구조체를 recv 함수로 한번씩 읽어오시는것같아서요.
혹시 recv로 한번에 읽어오는 데이터의 크기가 GETFILE, MYCMD의 크기보다 작아 한 번 더 읽어야 하는 경우가 발생할 수 있을까요?

 

image.png

해당 코드 구문입니다!

답변 2

1

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

네, 있을 수 있습니다. 그러나 그 가능성이 고려하지 않아도 될 만큼 매우 낮습니다. 만일 그런 경우가 발생했다면 서버가 사실 상 정상적으로 작동하기 어려운 수준에 처했을 가능성이 높고 OS 수준에서 각종 오류가 이미 발생할 것이기 때문입니다.

그리고 지금같은 구조에서 에러처리를 하지 않더라도 nCode 값이 처리 불가능함에 따라 자연스럽게 세션이 끊길 것(소켓을 닫음)이므로 고려하지 않아도 되겠습니다. 참고하시기 바랍니다. 😄

1

인프런 AI 인턴님의 프로필 이미지

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

강의의 recvsend 함수의 사용에 대한 질문은 소켓 프로그래밍에서 자주 접하는 기본적인 문제입니다. recv 함수는 보내는 측에서 전송한 데이터의 크기와 받을 측에서 수신한 데이터의 크기가 일치할 것을 보장하지 않습니다. 즉, 데이터를 송수신할 때 데이터가 도착하는 순서나 크기가 다를 수 있습니다. 이 때문에 recv 함수는 차여한 데이터가 손실되지 않도록 반복해서 호출되기도 합니다.

질문하신 내용처럼 recv 함수로 GETFILE, MYCMD 구조체만큼의 데이터를 한 번에 읽어오지 못하는 경우도 있습니다. 이런 경우 일반적으로 추가적인 recv 호출이 필요할 수 있습니다. 이와 같은 문제를 방지하기 위해 서버에서는 보통 명령을 보낼 때 충분한 크기의 버퍼를 잡고, 클라이언트에서 데이터를 읽어올 때는 반복적으로 recv 함수를 호출하여 원하는 양의 데이터를 모두 확보할 때까지 대기하는 방식을 채택합니다.

이미지를 통해 제공된 코드에서는 각 명령어(CMD_GET_LIST, CMD_GET_FILE 등)에 대해 어떤 처리를 수행하는지 세세하게 설명하고 있는 것을 볼 수 있습니다. recv 함수가 데이터를 송신할 때 발생할 수 있는 패킷 단위의 불일치에 대비하는 로직이 포함되어 있을 것으로 예상됩니다.

만약 명확한 동작 원리에 대해 추가적인 설명이 필요하시면, 다음의 유사한 질문 게시물을 참고하시기를 바랍니다:

이 게시물들은 프로토콜 구현 시 고려해야 할 상황이나 recv 함수의 연속 호출 관련 내용들을 추가적으로 설명하고 있으니 참고하시길 바랍니다.

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

HMiso님의 프로필 이미지

작성한 질문수

질문하기