2017-04-06 13 views
0

저는 1 대의 서버와 여러 대의 클라이언트 (최대 20 명)를 보유하고 있습니다. 모든 클라이언트가 임의의 시간에 UDP 데이터 그램을 보내고 있습니다. 각 데이터 그램은 매우 짧습니다 (약 10B). 그러나 각 클라이언트의 모든 데이터가 올바르게 수신되는지 확인해야합니다.여러 클라이언트에서 UDP 데이터를 동 기적으로 수신하는 올바른 방법은 무엇입니까?

모든 클라이언트가 동일한 포트에 데이터 그램을 보내고 클라이언트 B가 클라이언트 A의 데이터를 수신하는 정확한 시간에 클라이언트 B가 데이터 그램을 보내면 서버가 클라이언트 A의 데이터를 놓친 것 같습니다.

이 작업을 수행하는 올바른 방법은 무엇입니까? 20 명의 클라이언트 각각에 대해 리스너를 만들어야합니까?

답변

0

UDP 소켓을 포트에 바인딩하면 네트워킹 스택이 일정량의 들어오는 UDP 패킷을위한 버퍼를 할당하므로 (비교적시기 적절하게 recv()를 호출한다고 가정 할 때) 패킷이 손실됩니다.

/proc/sys/net/core/rmem_default for recv 

/proc/sys/net/core/wmem_default for send 

내가 리눅스의 기본 버퍼 크기는 131071B 생각 : 당신이 터미널에서 버퍼 크기를 참조하십시오

, 당신은 좀 걸릴 수 있습니다.

리눅스에

, 당신은 (루트)에 의해 (예 : 26214400까지) UDP 버퍼 크기를 변경할 수 있습니다

sysctl -w net.core.rmem_max=26214400 

당신은 또한 영구적으로 만들 수 있습니다 /etc/sysctl.conf에 다음 줄을 추가하여 :

net.core.rmem_max=26214400 

각 패킷이 10B이기 때문에 문제가되지 않습니다.

여전히 패킷 손실이 걱정된다면 클라이언트가 서버에서 ACK를 기다리거나 다시 보낼 프로토콜을 구현할 수 있습니다. 많은 프로토콜이 이러한 기능을 사용하지만 타이밍이 허용하는 경우에만 가능합니다. 예를 들어 스트리밍 데이터의 경우 재전송 할 시간이 없기 때문에 유용하지 않습니다.

또는 tcp 사용을 고려하십시오 (옵션 인 경우)