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);
!
수를 = receivedCount
이것이 제가 수표를 발행 한 이유입니다. 그러나 때로는 발생하고 때로는 그렇지 않습니다. 최대한의 보증이 필요합니다. 카운트가 다른 경우에는 바이트 또는 네트워크 문제로 인한 것이 아니라는 것을 알았습니다. 나는 때로는 헤더를받지 못한다 - 단지 데이터와 4 바이트를 읽을 때 실제로 데이터의 4 바이트를 읽는다. 왜 실패 하는가?
데이터가 때때로 가끔 은 머리글을 무시합니다. 왜 그럴까요? 어떻게 해결할 수 있습니까?
때때로 나는 또한 데이터 그램 소켓에 보낸 메시지가 내부 메시지 버퍼 또는 다른 네트워크 제한, 또는 수신하는 데 사용되는 버퍼보다 큰했다 socket.Receive
에 다음과 같은 오류가 데이터 그램 자체가 데이터 그램 자체보다 작음
문제는 때때로 발생하며 대부분의 경우에는 발생하지 않습니다. 최대 버퍼로 수신 할 수는 있지만 .. 메모리 문제.
성능 및 보장성 전달은 가능한 한 많이 이루어져야합니다. 서버 측에서 물리적으로 클라이언트 측에 접속할 수 없으므로이 값은 udp이어야합니다. 서버 간 클라이언트 일 수 있습니다.
의도적으로 UDP는 상대방이 패킷을 수신했다는 확인을 제공하지 않습니다. 배달 확인을 원하면 잘못된 프로토콜을 사용하십시오. UDP는 stateless입니다. –