C#我怎么知道是否发送了UDP数据包?

时间:2017-02-09 21:37:02

标签: c# udp

我正在使用此代码

      bool NotSent = true;
        while (NotSent)
        {
            try
            {
                UdpClient udpServer = new UdpClient(port);
                udpServer.Connect(IPAddress.Parse("192.168.1.66"), port);
                Byte[] sendBytes = Encoding.ASCII.GetBytes("Hello");
                int res = udpServer.Send(sendBytes, sendBytes.Length);
                MessageBox.Show("Sent : " + res);
                udpServer.Close();
                NotSent = false;
            }
            catch (Exception ex) { MessageBox.Show("Error : " + ex.ToString()); continue; }
        }

所以我怎么知道“Hello”是否发送和接收,因为所有结果总是返回17

2 个答案:

答案 0 :(得分:2)

UDP不实现TCP或其他协议之类的确认段。

  

UdpClient.Send()将数据报发送到指定的端点和   返回成功发送的字节数。

因此,您在res中看到的 17 告诉您 17个字节已成功发送。

来源:https://msdn.microsoft.com/en-us/library/82dxxas0(v=vs.110).aspx

答案 1 :(得分:0)

UDP是一种无连接协议,因此无法保证数据已发送到其接收方。

确认数据确实已发送的一种简单方法是让远程主机向服务器发回确认(确认)。

以下是一个可以从MSDN中找到的简单实现

// Sends a message to a different host using optional hostname and port parameters.
     UdpClient udpClientB = new UdpClient();
     udpClientB.Send(sendBytes, sendBytes.Length, "AlternateHostMachineName", 11000);

     //IPEndPoint object will allow us to read datagrams sent from any source.
     IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

     // Blocks until a message returns on this socket from a remote host.
     Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint); 
     string returnData = Encoding.ASCII.GetString(receiveBytes);