2013-05-30 3 views
1

C# 응용 프로그램에서 Socket.SendTo을 초당 최대 10,000 회까지 호출하여 UDP 메시지를 보내고 있습니다. 때로는 내가 얼마나 보내고 있는지를 파악할 수 없다는 것을 알고 있습니다. 얼마나 많은 데이터 (바이트 또는 횟수를 내가 SendTo라고 불렀는지)가 큐에 대기했는지 또는 백 로그로 전송되었는지 확인할 방법이 있습니까?C# 소켓이 전송 대기중인 바이트 수를 어떻게 확인할 수 있습니까?

이상적인 해결 방법은 소켓이 뒤에서 작동하기 시작하면 필수 메시지를 소켓에서 대기열에 넣으므로 SendTo을 호출하기 전에 소켓 상태를 알고 있으면 도움이 될 것입니다.

감사

답변

0

패킷은이 작업을 수행하기 위해 정말 가능하지의 많은 다른 장소에서 대기 할 수 있습니다 : 그들은, 소켓의 수는 IP에서 네트워크 인터페이스의 출력 큐에, 어딘가에 등을 스택 수 있습니다 ..

운영 체제에서 적절한 대기열을 쿼리하는 방법을 찾았더라도 (실제로는 이식 할 수 없음)이 방법으로 문제를 해결할 수는 없습니다. 그 이유는 실제로 네트워크 인터페이스가 처리 할 수있는 것보다 더 빨리 메시지를 보내지 않는 한 병목 현상이 네트워크상의 송신 컴퓨터 외부의 가능성이 높기 때문입니다. 요즘에는 범용 컴퓨터의 많은 네트워크 인터페이스가 1Gbps이기 때문에 네트워크 인터페이스가 패킷을 보내는 속도만큼 빠르게 보낼 수 있습니다. 초크 포인트는 아마 이더넷 스위치 또는 어딘가에있는 라우터 일 수 있으며, 이더넷 스위치 또는 라우터가 패킷을 삭제할 때 및 그렇지 않을 때 대기열을 쿼리하여 알 수 없습니다.

0

당신이 원하는 것은 응용 프로그램이 아닌 OS 커널이 발신 대기열을 관리한다는 것입니다. 그리고 UDP를 사용하면 대기열이 적어지기 때문에 필요한 경우 패킷이 떨어집니다.

프로토콜 통계 및 패킷 드롭 수를 보려면 명령 줄에 netstat -s을 입력하는 것이 가장 좋습니다 (Windows는 앱에서 같은 쿼리를 수행 할 수있는 멋진 API를 가지고 있을지도 모르지만).

호스트와 네트워크가 유지할 수있는 허용 가능한 메시지 속도를 찾아서 초과하거나 초과하면 "약한"출력으로 전환하십시오. 이것은 약간의 부기가 필요하지만 타임 스탬프의 링 버퍼로 쉽게 수행 될 수 있습니다.

관련 문제