gpt4 book ai didi

c# - 由于极不可能的情况发生而丢失数据包?

转载 作者:太空宇宙 更新时间:2023-11-03 22:03:46 26 4
gpt4 key购买 nike

我最近一直在使用 UDP 套接字。我读过 UDP 没有内部缓冲区。这意味着如果一个数据包到达并且没有人在等待它,它就会被丢弃。我想到了一种不太可能发生的情况。但如果发生这种情况,可能会导致问题。

byte[] buffer = new byte[1024];
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(...);
while (true)
{
EndPoint remote = new IPEndPoint(IPAddress.Any, 0);
socket.ReceiveFrom(buffer, ref remote);
socket.SendTo(remote, new byte[] { 1, 2, 3, 4 });
}

如果在执行 SendTo 时,这是一种非异步方法(因此它会阻塞运行它的线程,直到它完成,即完成发送数据),来自不同主机的另一个数据包到达怎么办?由于没有执行ReceiveFrom方法,数据包会被转储吗?

假设"is",我考虑过使用异步套接字。它看起来像这样:

Socket socket;    
byte[] buffer;

void StartServer()
{
buffer = new byte[1024];
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(...);
EndPoint remote = new IPEndPoint(IPAddress.Any, 0);

StartReceive();
}

void StartReceive()
{
socket.BeginReceiveFrom(buffer, 0, buffer.Size, SocketFlags.None, ref remote, OnReceive, null);
}

void OnReceive(IAsyncState state)
{
EndPoint epRemote = new IPEndPoint(IPAddress.Any, 0);
socket.EndReceiveFrom(state, ref epRemote);
socket.BeginSendTo(new byte[] { 1, 2, 3, 4 }, 0, 4, SocketFlags.None, epRemote, null, null);
StartReceive();
}

当 OnReceive 方法被 socket.BeginReceiveFrom 调用完成时,它的代码被执行。由于此代码使用 BeginSendTo,因此它不会阻塞线程。但是,如果数据包在 OnReceive 可以调用 StartReceive 之前到达怎么办?会丢失吗?

所以我的问题是:UDP 数据包是否会被缓冲,如果是,缓冲多长时间?

最佳答案

不,框架的内部结构将确保数据包在被解析之前处于队列中。这通常是通过使用一个缓冲区来实现的,该缓冲区将数据包保存一段时间,直到接收方真正收到数据包。

有多个层次可以确保这一点,要了解更多信息,并且因为您使用 OSI 的应用层,您应该学习 OSI 以深入理解这些概念。

关于c# - 由于极不可能的情况发生而丢失数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9179961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com