2010-03-09 5 views
2

우리가 UDP 수신을 위해 알다시피, 우리는 당신의 UDP 데이터를 넣어로부터 바이트 배열을 받아 Socket.ReceiveFrom 또는 UdpClient.receive어떻게 소켓 UDP 아래에 버퍼 크기를 설정할 수 있습니까?

Socket.ReceiveFrom를 사용합니다.

UdpClient.receive 직접 바이트 배열을 반환 어디 데이터가

내 질문은 어떻게 소켓 내부의 버퍼 크기를 설정합니다. 나는 운영 체제가 UDP 데이터 수신을위한 자체 버퍼를 유지한다고 생각한다. 예를 들어 UDP 패킷이 내 컴퓨터로 보내지는 경우 OS는이를 버퍼에 저장하고 Socket.ReceiveFrom 또는 UdpClient.receive를 기다립니다.

어떻게 내부 버퍼의 크기를 변경할 수 있습니까?

나는 Socket.ReceiveBuffSize를 시도했다. UDP에 전혀 영향을 미치지 않으며, 분명히 그것이 TCP 윈도우에 대한 것이라고 말했다. 또한 나는 Socket.ReceiveBufferSize가 UDP가 아니라는 것을 증명하는 많은 실험을 해왔다.

누군가 UDP 내부 버퍼에 대한 통찰력을 공유 할 수 있습니까 ???

나는

http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/c80ad765-b10f-4bca-917e-2959c9eb102a

데이브 Socket.ReceiveBufferSize는 UDP에 대한 내부 버퍼를 설정할 수 있다고, 예를 들어, 여기에 몇 가지 게시물을 보았다. 나는 동의하지 않는다.

내가 한 실험은 다음과 같이이다 :

27 호스트 (적어도 거의) 동시에 LAN 내에서 나에게 10킬로바이트 UDP 패킷을 보낼 수 있습니다. 각 패킷을 처리하는 while 루프가 있습니다. 각 패킷에 대해 스레드를 생성하고 처리합니다. 패킷을 수신하기 위해 UdpClient 또는 Socket을 사용했습니다.

패킷의 약 50 %가 손실되었습니다. 나는 그것이 UDP 전송의 버스트라고 생각하고 나는 모든 것을 다룰 수 없다.

이 때문에 UDP의 버퍼 크기를 늘리고 싶습니다. 말하자면 버퍼 크기를 1MB로 변경하면 27 * 10KB = 270KB 데이터가 버퍼에 수용 될 수 있습니다.

Socket.ReceiveBufferSize를 많은 값으로 변경하려고 시도했지만 전혀 효과가 없습니다.

아무도 도와 줄 수 있습니까?

+0

@ Jack에 게시 된 StackOverflow.com – Snark

+0

에 여러 번 게시하지 마십시오. http://stackoverflow.com/questions/2408212/how-can-i-set-the-buffer-size-for-the-underneath-socket-udp-c 질문이 스택 오버플로에 속하지 않으면 운영자가 있습니다. 그것을 적절한 장소로 옮기십시오. – heavyd

+0

죄송합니다. 여러 번 게시하십시오. 원래 게시물에서 누군가 내가 여기에 게시하도록 제안합니다. 질문은 udp의 버퍼 크기를 변경하기 위해 Windows 레지스트리를 실행합니다. –

답변

1

나는 때때로 패킷을 버렸고 버퍼를 늘려 성공했다.

UdpClient를 사용했고 소켓에 기본 (8192 바이트)보다 큰 값을 설정했습니다. 이것은 나를 위해 문제를 해결했다.

제 시나리오에서는 크기가 작을수록 드롭이 많을수록 커집니다. 나는 마침내 2^18의 값을 선택했다.

관련 문제