【发布时间】:2012-06-25 09:01:36
【问题描述】:
我有一个 udp 客户端和一个 udp 服务器。 udp 客户端和服务器实际上是在物理上断开连接的。 所以我只能向 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);
出现了几个问题:
-
count != receivedCount
这就是我进行检查的原因,但有时会发生,有时不会。我确实需要最大保证。 我发现当计数不同时,不是因为字节数下降或网络问题。我只是有时没有收到标题 - 只有数据,当我读取 4 个字节时,我实际上读取了 4 个字节的数据,这就是它失败的原因。
数据只是有时覆盖标题。 这是为什么呢?我该如何解决这个问题?
-
有时我也会在 socket.Receive 上收到以下错误
在数据报套接字上发送的消息大于内部消息缓冲区或其他网络限制,或者用于接收数据报的缓冲区小于数据报本身
问题是有时会发生,但大多数时候不会... 我可以在最大缓冲区中接收所有内容..但是我会遇到内存问题。
这应该是高性能和尽可能有保证的交付.. 这必须是 udp,因为服务器端无法物理联系客户端 这是一种方式 - 客户端到服务器。
【问题讨论】:
-
UDP 设计不提供确认对方已收到数据包。如果您想要确认交货,您使用了错误的协议。 UDP 是无状态的。
标签: c# connection udp client-server