2013-03-16 4 views
1

UDP (C)에서 작은 응용 프로그램을 구현하고 있습니다. 서버는 주어진 파일로부터 일정량의 청크 (예 : 100 바이트/호출)의 데이터를 클라이언트에 보냅니다. 클라이언트는 파일을 다운로드하여 어딘가에 저장합니다. catch는 클라이언트가 읽기/호출 할 바이트 수를 나타내는 매개 변수를받을 수 있다는 것입니다.
내 문제는 서버가 100 바이트/호출을 보내고 클라이언트가 15 바이트/호출 만 읽도록 설정되어있는 경우입니다. 다른 85 바이트는 메시지가 UDP 큐에서 제거되기 때문에 손실됩니다.UDP - 청크로 대기열에서 데이터를 읽습니다.

메시지를 완전히 읽을 때까지 대기열에서 메시지를 제거하지 않고 청크로 읽을 수있는 방법이 있습니까?

+0

클라이언트 서버 프로토콜을 변경하여 두 끝이 서로를 혼동하지 않게하십시오. – Vorsprung

+0

위대할지 모르지만 프로토콜을 작성하지 않았습니다. 나는 내 컴퓨터 네트워크 코스와 프로토콜에 주어진이 작은 응용 프로그램을 할 수있어. –

+0

다른 방법으로 말씀 드리겠습니다. "서버가 100 바이트/콜을 전송하고 클라이언트가 15 바이트/콜만을 읽도록 설정되면"한 쪽 또는 다른 쪽을 제어해야합니다. 클라이언트와 서버가 잘못된 바이트 수를 읽도록 설정하지 마십시오! – Vorsprung

답변

2

UDP는 TCP처럼 청크 판독을 허용하지 않습니다. UDP 메시지를 읽는 것은 전부 또는 아무 것도 아니므로 전체 메시지 전체를 읽거나 전혀 읽지 않습니다. 중간에는 없습니다. 따라서 UDP 기반 프로토콜은 고정 된 크기의 메시지를 사용하거나 메시지 품질을 양측에 동적으로 협상하도록 요구합니다 (예 : TrivialFTP).

UDP 프로토콜에서 각 메시지에 바이트 크기를 전송해야 할 이유가 없습니다. 메시지 크기 자체는 메시지 내부의 데이터 크기를 암시 적으로 지정합니다.

실제로 메시지를 읽기 전에 당신이 절대적으로 메시지의 크기를 결정해야하는 경우, 당신은 MSG_PEEK 플래그 recvfrom()를 호출하려고하고, UDP 메시지를 초과하지 않을 것입니다 (적어도 64K로 그것을 데이터를 복사 할 수있는 큰 버퍼를 줄 수 IPv6 Jumbograms를 사용하고 있지 않는 한 별도의 문제입니다). 출력 결과는 대기열에 남아있는 메시지의 실제 크기를 알려줍니다. 그러나이 방법을 사용하면 MSG_PEEK 플래그를 삭제하고 64K 버퍼를 항상 읽으므로 버퍼 크기가 충분하지 않아 데이터를 삭제할 가능성이 없습니다.

+0

답변 해 주셔서 감사합니다. 이것은 문제를 연구하는 동안 얻은 결론과 같습니다. 좋은 설명을 위해 +1. –

0

UDP 버퍼에서 데이터를 무한히 읽도록 스레드를 생성하고 데이터를 원 버퍼에 저장할 수 있습니다. 클라이언트가 귀하의 속도로 데이터를 소비하는 것보다. 버퍼가 오버플로되면 아무 것도 할 수 없습니다. 서버의 전송 속도가 클라이언트의 전송 속도보다 빠르기 때문입니다.

관련 문제