작성
·
165
0
안녕하세요, Client Socket과 이벤트를 select 하실때 FD_READ | FD_WRITE | FD_CLOSE 3가지를 동시에 바인딩하시는 이유가 궁금합니다
강의중 언급하신
'TCP 논 블로킹 소켓에서, 데이터를가 분할되서 송신될 수 있다. 하지만 웬만하면 일어나지 않는다.'
의 상황에 대응하기 위하여 send 함수 호출 시 각 인자를 수정하셨는데,
FD_WRITE는, 만약 위와 같은 상황이 발생했을때, 다음 프레임에서 이벤트를 감지하기 위함이신지,
만약, 위와 같은 데이터 분할 송신이 절대 일어나지 않는경우라고 가정하면 FD_READ | FD_CLOSE 2개의 플래그만으로도 목표하신 에코서버 구현이 가능할것인지
이 궁금합니다.
답변 1
0
구매한 강의가 아니라서 내용을 못보니 그냥 이론적으로만 내용에 첨언을 드리자면 '왠만해서는 일어나지 않는다'가 핵심입니다. 하지만 엄연히 이걸 일어나지 않는다고 가정하면 안됩니다.
인터넷 환경이 충분히 빠르고 작은 데이터면 Send에 넘긴 데이터 사이즈와 Send에서 리턴하는 데이터 사이즈가 동일하지만 어느정도 이상되면(예를 들어 2~3KB 이상의 데이터, 또는 데이터 처리에 지연이 발생하여 일부만 전송되는 등) 한번에 전송하지 못합니다.
따라서 TCP로 전송하는 데이터는 수신측에서 원래 전송된 데이터가 몇바이트인지 구분이 가능해야하고(데이터 헤더에 데이터 사이즈를 명시적으로 보낸다거나 JSON 문서로 통신할 땐 뉴라인 없이 직렬화 하여 문서 끝에 뉴라인을 넣어 구분하는 등) 송신측에서는 전송된 데이터 사이즈를 얻어서 전송할 사이즈 보다 적으면 나머지 데이터 전송을 다시 시도해야하고 수신측에서도 완전히 데이터가 수신되었는지 체크하여 이어서 수신할 수 있도록 해야합니다. (별도의 소켓 라이브러리를 사용할 경우 라이브러리에서 이걸 해주는 경우도 있습니다. asio의 asio::async_read, asio::async_write 등등)
결론은 hello world같은 아주 적은 데이터를 사용할 경우 가능은 하겠지만 무조건이라고 생각하면 안된입니다.