2012-06-25 2 views
0

udp 클라이언트와 udp 서버가 있습니다. udp 클라이언트와 서버는 실제로 물리적으로 연결이 끊어졌습니다. 그래서 나는 udp 서버로만 메시지를 보낼 수 있지만 데이터가 제대로 수신되었는지 여부에 대한 응답을받을 수 없습니다.C# UDP 클라이언트 서버 문제

그래서 내가 보내려는 데이터 양을 지정하는 4 바이트의 헤더를 보내는 것입니다. 그리고 이전에 보낸 크기에 따라 데이터를 읽었습니다.

클라이언트 측

// Sending Header(header is the size of the data) 
byte[] header = BitConverter.GetBytes(data.Count()); 
socket.SendTo(header, 0, header.Count(), SocketFlags.None, outEP); 
// Sending Data 
socket.SendTo(data, 0, data.Count(), SocketFlags.None, outEP); 

서버 측 몇 가지 문제가 올

// Receiving input size 
int receivedCount = socket.EndReceive(result); 
// Header is filled on BeginReceive 
Int32 count = BitConverter.ToInt32(header, 0); 
if(count != receivedCount) throw; 
// Then I receive the count relevent 
socket.Receive(data, 0, count, SocketFlags.None); 

!

  1. 수를 = receivedCount

    이것이 제가 수표를 발행 한 이유입니다. 그러나 때로는 발생하고 때로는 그렇지 않습니다. 최대한의 보증이 필요합니다. 카운트가 다른 경우에는 바이트 또는 네트워크 문제로 인한 것이 아니라는 것을 알았습니다. 나는 때로는 헤더를받지 못한다 - 단지 데이터와 4 바이트를 읽을 때 실제로 데이터의 4 바이트를 읽는다. 왜 실패 하는가?

    데이터가 때때로 가끔 은 머리글을 무시합니다. 왜 그럴까요? 어떻게 해결할 수 있습니까?

  2. 때때로 나는 또한 데이터 그램 소켓에 보낸 메시지가 내부 메시지 버퍼 또는 다른 네트워크 제한, 또는 수신하는 데 사용되는 버퍼보다 ​​큰했다 socket.Receive

    에 다음과 같은 오류가 데이터 그램 자체가 데이터 그램 자체보다 작음

    문제는 때때로 발생하며 대부분의 경우에는 발생하지 않습니다. 최대 버퍼로 수신 할 수는 있지만 .. 메모리 문제.

    성능 및 보장성 전달은 가능한 한 많이 이루어져야합니다. 서버 측에서 물리적으로 클라이언트 측에 접속할 수 없으므로이 값은 udp이어야합니다. 서버 간 클라이언트 일 수 있습니다.

+0

의도적으로 UDP는 상대방이 패킷을 수신했다는 확인을 제공하지 않습니다. 배달 확인을 원하면 잘못된 프로토콜을 사용하십시오. UDP는 stateless입니다. –

답변

1

UDP는 패킷을 보내는 순서 (또는 패킷이 도착하는 순서)로 도착한다고 보장하지 않습니다. 나는 무엇이든 덮어 쓰기/덮어 쓰기가 의심된다. 헤더와 페이로드를 하나의 패킷으로 보내야합니다.

TCP 사용을 고려 했습니까? UDP가 더 빠르다고 주장 할 수도 있지만, 패킷 재정렬을 구현하려는 경우에는 그 이점을 잃을 것입니다. (이어야 함).

UDP (소프트웨어 처리 재전송)에서 TCP (네트워크 계층 처리 재전송) 또는 SIP을 보면 손실 된 패킷을 감지하고 다시 전송할 수있는 방법이 있습니다. 예를 들어 패킷에 번호를 매기고 수신자가 각각 패킷을 수신하도록 알릴 수 있습니다.

1

UDP를 사용할 때는 양방향 통신이 필요하며 손실, 이중 또는 무질서한 패킷이 없는지 확인하십시오.
PGM - Pragmatic Multicast와 같은 프로토콜을 보았습니까?
또한 네트워크 스택을 빠르게 정리하고 대기열이나 다른 메모리 데이터 구조에 데이터를 게시하기 위해 단일 스레드 만 필요할 수도 있습니다. 네트워크 스택은 상상할 수있는 것보다 훨씬 작으며 생각했던 것보다 훨씬 더 빠릅니다.
편집 : UDP의 문제점은 수신자가 패킷을 감지하더라도 패킷 또는 변경 사항이 손실되었거나 복제되었을 수 있으며 통신이 불가능할 때 수신자가이를 수정하도록 요청해야한다는 것입니다.

+0

양방향 의사 소통이 필요하지 않습니다. 배달 보증이있는 편도 통신이 필요합니다. 네트워크를 정리하는 단일 스레드로 말하고자하는 바를 설명 할 수 있습니까? – Lee

+1

나는 보통 128kb의 바이트 배열과 수신 및 처리 스레드를 가지고있다. 128kb가 가득 차면 너무 느려서 연결이 끊어지는 것을 안다. – weismat

+0

글쎄 내 질문은 어떻게 패킷 손실의 가능성을 좁힐 수 있습니다 - 프로그래밍 방식으로 - 어쩌면 내가 Thread.Sleep() 각 요청을 보낸 후 할 수 있습니까? 어쩌면 하나의 패킷을 보낸 다음 큰 버퍼를 가지고 있을까요? 모범 사례는 무엇입니까? 편집 - 귀하의 회신을 보았습니다. 예. 옵션입니다 .. – Lee