gpt4 book ai didi

c# - 处理来自 UdpClient.BeginReceive() 的传入消息

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:04 30 4
gpt4 key购买 nike

好的,这是我的第一个堆栈溢出问题,所以请随时提出更好的提问方式或我下次应该包括的内容。大多数时候我可以通过谷歌获得答案,但这个有点棘手......

我正在用 C# 编写一个 Windows 应用程序,它监听 UDP 端口,然后处理传入的 UDP 消息。更具体地说,我正在使用 UDPClient 类并使用 BeginReceive 方法进行监听。接收回调依次触发它自己的消息接收事件,然后再次重置 UDP 客户端。此“MessageReceived”事件随后由处理器对象处理。

我认为这一切都非常聪明,直到我的经理向我提出了一些问题,例如:

  • 它一次可以接收多少条消息?如果我们得到更多会怎样?
  • 如果处理时间过长,消息是否排队或丢失?
  • 如果处理时间过长会怎样?

我们不能因为最后一条消息仍在处理中而丢失消息,我们也不能在系统崩溃之前继续构建,因为它也没有内存。他想听到的(理所当然的)是某种验证,即存在一种确定性的方法来处理消息“ Storm ”。不幸的是,我不知道从哪里得到答案。我在下面包含了我认为是相关的代码。

所以:

  1. 有人知道上述问题的答案吗?
  2. 我应该在哪里做一些研究来找到这些答案和/或一些可用于此类事情的模式?
  3. 我可以使用什么样的工具来观察调试/性能分析的过程?
  4. 如果我在设计中犯了一个巨大的错误,我应该怎么做才能解决它(即引入队列、使用线程池等)?

    public void ReceiveCallback(IAsyncResult ar)
    {
    //Cast the item back to the listener
    UdpListener listener = (UdpListener)ar.AsyncState;

    //If we are supposed to be listening, then get the data from the socket
    //Listen is false during shutdown
    if (Listen)
    {
    //The try catch is placed inside the listen loop so that if there is an error in the processing it will
    //recover and listen again. this may cause more exceptions but we can be sure that it will not
    // stop listening without us knowing
    try
    {
    //Address and port from the external system
    IPEndPoint ep = listener.EndPoint;

    //Get the data from the async read
    Byte[] receiveBytes = listener.Client.EndReceive(ar, ref ep);

    //Reset the socket to listen again
    listener.Client.BeginReceive(new AsyncCallback(ReceiveCallback), listener);

    //Execute the event to pass external components the message
    HeartbeatEventArgs hea = new HeartbeatEventArgs(DateTime.Now, ep, receiveBytes);
    OnHeartbeatReceived(hea);

    //Ack back to the external system
    HeartbeatAcknowledgement(new IPEndPoint(ep.Address, ep.Port), receiveBytes);
    }
    catch (Exception e)
    {
    log.Error(e.Message);
    //Reset the socket to listen again

    }
    }
    }

listner 只是 UDPClient 的包装器。如下:

#region UdpClient Wrapper (UdpListener)
/// <summary>
/// UdpListener is used to control the asynchronous processing of a UDPClient object.
/// </summary>
public class UdpListener
{
/// <summary>
/// IPEndpoint on which to accept a connection. Usually set to "Any".
/// </summary>
public IPEndPoint EndPoint { get; set; }
/// <summary>
/// The socket based client object that is used for communication
/// </summary>
public UdpClient Client { get; set; }

public UdpListener(int port)
{
EndPoint = new IPEndPoint(IPAddress.Any, port);
Client = new UdpClient(EndPoint);
}
}
#endregion

谢谢,

丁斯代尔

最佳答案

如果担心丢失消息,那么 UDP 不适合您。 UDP 只保证如果消息到达,它将是完整的。它不保证消息顺序或传递。换句话说,如果客户端发送两条消息,您可能会无序地收到它们,或者只收到第一条消息,或者只收到最后一条消息(或者根本没有收到)。如果您需要保证交付和订购,请改用 TCP(TCP 带有它自己的一组保证和陷阱)。

关于它能处理多少条消息,你会有一个上限。如果您处理消息的速度没有快于它们到达的速度,那么它们将在您的应用程序层或 UDP 网络层中排队。一旦网络缓冲区已满,您的网络接口(interface)就会开始丢弃消息。

关于c# - 处理来自 UdpClient.BeginReceive() 的传入消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14946974/

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