我有一个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是无状态的。 –