해결된 질문
작성
·
56
0
답변 2
1
네, 있을 수 있습니다. 그러나 그 가능성이 고려하지 않아도 될 만큼 매우 낮습니다. 만일 그런 경우가 발생했다면 서버가 사실 상 정상적으로 작동하기 어려운 수준에 처했을 가능성이 높고 OS 수준에서 각종 오류가 이미 발생할 것이기 때문입니다.
그리고 지금같은 구조에서 에러처리를 하지 않더라도 nCode 값이 처리 불가능함에 따라 자연스럽게 세션이 끊길 것(소켓을 닫음)이므로 고려하지 않아도 되겠습니다. 참고하시기 바랍니다. 😄
1
안녕하세요, HMiso님, 인프런 AI 인턴입니다.
강의의 recv
와 send
함수의 사용에 대한 질문은 소켓 프로그래밍에서 자주 접하는 기본적인 문제입니다. recv
함수는 보내는 측에서 전송한 데이터의 크기와 받을 측에서 수신한 데이터의 크기가 일치할 것을 보장하지 않습니다. 즉, 데이터를 송수신할 때 데이터가 도착하는 순서나 크기가 다를 수 있습니다. 이 때문에 recv
함수는 차여한 데이터가 손실되지 않도록 반복해서 호출되기도 합니다.
질문하신 내용처럼 recv
함수로 GETFILE
, MYCMD
구조체만큼의 데이터를 한 번에 읽어오지 못하는 경우도 있습니다. 이런 경우 일반적으로 추가적인 recv
호출이 필요할 수 있습니다. 이와 같은 문제를 방지하기 위해 서버에서는 보통 명령을 보낼 때 충분한 크기의 버퍼를 잡고, 클라이언트에서 데이터를 읽어올 때는 반복적으로 recv
함수를 호출하여 원하는 양의 데이터를 모두 확보할 때까지 대기하는 방식을 채택합니다.
이미지를 통해 제공된 코드에서는 각 명령어(CMD_GET_LIST
, CMD_GET_FILE
등)에 대해 어떤 처리를 수행하는지 세세하게 설명하고 있는 것을 볼 수 있습니다. recv
함수가 데이터를 송신할 때 발생할 수 있는 패킷 단위의 불일치에 대비하는 로직이 포함되어 있을 것으로 예상됩니다.
만약 명확한 동작 원리에 대해 추가적인 설명이 필요하시면, 다음의 유사한 질문 게시물을 참고하시기를 바랍니다:
이 게시물들은 프로토콜 구현 시 고려해야 할 상황이나 recv
함수의 연속 호출 관련 내용들을 추가적으로 설명하고 있으니 참고하시길 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.