2017-05-11 1 views
0

UDP 클라이언트 및 서버 응용 프로그램과 UDP를 통한 사용자 지정 프로토콜이 있습니다.UDP 패킷 바이트 읽기 입도?

각 "프로토콜 패킷"은 페이로드 크기와 페이로드 자체가 포함 된 헤더를 포함합니다.

각 "프로토콜 패킷"은 MTU 크기를 초과하지 않으며 조각화가 부족할 것으로 예상됩니다. ---

  1. 클라이언트 전송 헤더 (2 바이트) 및 페이로드 (N < MTU-2 바이트) :

    은 현재 내가 ASIO 라이브러리를 사용하여 몇 가지 문제가 발생 해요 :

    시간 다이어그램 --->

  2. 서버는 페이로드 크기에 대해 확실히 2 바이트 만 읽습니다.

  3. 서버는

  4. 서버가 페이로드 ..... 아무것도의 N 바이트를받을려고 페이로드의 크기 헤더를받을 수 있습니다. 완료 핸들러는 절대로 발생하지 않습니다.

하는 경우 (디버깅 목적) 클라이언트 전송 또 하나 개의 패킷이 서버 완료 핸들러가 해고 - 나는 ASIO 내 비동기 루프가 괜찮습니다 생각하는 이유입니다 무슨 일이.

또한 서버가 하나의 읽기에 대해 전체 전송 2 + N 바이트를 읽으려고하면 모든 데이터가 수신됩니다.

그래서 저는 조금 혼란스러워합니다. _socket.async_receive_from()을 연속적으로 실행하여 하나의 UDP 데이터 그램의 개별 바이트를 순차적으로 읽을 수 있습니다.

도와 주셔서 감사합니다. 미리 감사드립니다.

+0

서버는 어떻게이 2 바이트를 읽습니까? 그리고, 수신 읽기 처리기가 전송 된 바이트에 대해 말하는 것은 무엇입니까? 내 생각에이 읽기는 단지 2 바이트가 아닌 모든 데이터를 가져옵니다. –

+0

2 바이트가 올바르게 수신되면 "전송 된 바이트"에는 _socket.async_receive_from()이 요청한대로 정확히 2 바이트가 포함됩니다. 그래서 나는 내 관심사를 확인해 줄 사람이 필요하며 이미 설명이있는 것처럼 보인다. 감사 . – user1503944

답변

1

_socket.async_receive_from()을 순차적으로 실행하여 하나의 UDP 데이터 그램의 개별 바이트를 순차적으로 읽을 수 있습니다.

이것이 진술 인 경우 올바르지 않으며 질문 인 경우 대답은 '아니오'입니다. UDP는 데이터 그램 프로토콜입니다. 전체 데이터 그램을 얻거나 아무것도 얻지 못합니다. 당신이 그것의 일부를 읽으면 나머지는 버려집니다.

아마도 당신은 readv() 또는 recvmsg()을 찾고있을 것입니다.

+0

설명해 주셔서 감사합니다. 내 경우에는 "시간당 하나의 데이터 그램"이 부분 읽기보다 훨씬 더 좋은 해결책입니다. 프로토콜의 각 패킷은 자체적으로 충분하고 프로토콜 user1503944