udp有时无法接收数据

时间:2017-07-10 09:30:32

标签: c# udp

如果在接收前2分钟内没有发送数据,我的udp客户端无法从服务器接收任何内容。这很奇怪,如果我呼叫发送,它可以再次接收。我在Windows上的模拟器中运行应用程序,WireShark可以捕获所有数据包,但我的应用程序无法检测到它。我想知道是否因为arp表已过期。

这只发生在移动设备和模拟器上,而不是统一。

任何人都知道为什么?感谢您的回答。

udp客户端代码:

    private UdpClient m_udpClient = null;
    private IPEndPoint m_IPEndPoint = null;
    public override bool Connect(string strIp, int nPort)
    {
        if (nPort == 0 || strIp.Length == 0)
        return false;

        if (m_udpClient == null || (m_udpClient.Client == null || !m_udpClient.Client.Connected))
        {
            m_udpClient = new UdpClient();
            try
            {
                m_udpClient.Connect(strIp, nPort);
            }
            catch (SocketException ex)
            {
                DebugLog.log("ex : " + ex.ToString());
            }

            if (m_udpClient.Client != null && m_udpClient.Client.Connected)
            {
                IPAddress address = IPAddress.Parse(strIp);
                m_IPEndPoint = new IPEndPoint(address, nPort);
                return true;
            }
        }
        return false;
}

private void receive()
{        
    while (m_udpClient.Client.Available > 0)
    {
        Byte[] data = null;
        try
        {
            data = m_udpClient.Receive(ref m_IPEndPoint);
        }
        catch (Exception e)
        {
                        DebugLog.log(e.ToString());
        }
        if (data != null && data.Length > 0)
        {               
            UnityEngine.Debug.Log ("receive,len:" + data.Length);
        }
    }
}

private void send(byte[] buf, int size)
{
    if (IsConnected())
    {
        try
        {
            m_udpClient.Send(buf, size);
        }
        catch (Exception ex)
        {
            DebugLog.log("ex : " + ex.ToString());
        }
    }
}

public override bool IsConnected()
{
    return m_udpClient != null && m_udpClient.Client != null && m_udpClient.Client.Connected;
}

1 个答案:

答案 0 :(得分:0)

我有同样的问题! 在UDP服务器和客户端之间,我们使用“heartbeat-packet”,没有问题。 当我停止“heartbeat-packet”,15秒后,服务器无法接收数据包, 但wiresharp可以捕获所有数据包。

我的网络很简单,只需将PC直接连接设备即可。

到目前为止,我还没有找到真正的原因。 只需通过重复发送“空包”,当“心跳包”被停止时修复它。