这些代码通过用户数据报协议提供发送数据。下面有两个代码。当我使用第一个代码来获取无法访问的IP地址时,我得到了三秒钟的延迟。
请查看新结果标题
刚刚打开新的C#CONSOLE APP并将这些代码粘贴在其中。 (第一个代码)
using System;
using System.Net;
using System.Net.Sockets;
namespace Test
{
class Program
{
static void Main(string[] args)
{
byte[] data = { 1, 20, 60, 44, 244 };
while (true)
{
Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt"));
try
{
using (var client = new UdpClient())
{
// Please check IP Address, It must be unreachable...
// IPEndPoint ep = new IPEndPoint(IPAddress.Parse("192.168.1.141"), 55600);
// client.Connect(ep);
client.Send(data, data.Length, "192.168.1.141" , 55600);
}
Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt"));
Console.WriteLine(" ");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}
}
测试1(使用时):可达到的IP
测试2(使用中):无法访问的IP
的输出:
Test1 label1 ---> h:mm:ss label2 ---> h:mm:ss(同一时间)
Test2 label1 ---> h:mm:ss label2 ---> h:mm:ss +3秒
(不例外)WireShark结果:
测试1(使用时):可达的Ip - >数据被捕获,见 测试2(使用时):无法访问的IP->没有数据。当我使用没有“使用”块时,我没有得到三秒钟 延迟。
刚刚打开新的C#CONSOLE APP并将这些代码粘贴在其中。 (第二个代码)
using System;
using System.Net;
using System.Net.Sockets;
namespace Test
{
class Program
{
static void Main(string[] args)
{
byte[] data = { 1, 20, 60, 44, 244 };
while (true)
{
Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt"));
try
{
var client = new UdpClient();
//Please check IP address, It must be unreachable...
// IPEndPoint ep = new IPEndPoint(IPAddress.Parse("192.168.1.41"), 5600);
// client.Connect(ep);
client.Send(data, data.Length, "192.168.1.141", 55600);
Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt"));
}
catch (Exception xe)
{
Console.WriteLine(xe.ToString());
}
Console.WriteLine(" ");
System.Threading.Thread.Sleep(1000);
}
}
}
}
测试1(不使用):可达Ip
测试2(不使用):无法访问的Ip输出:
Test1 label1 ---> h:mm:ss(同一时间)label2 ---> h:mm:ss(同一时间)
Test2 label1 ---> h:mm:ss(同一时间)label2 ---> h:mm:ss(同一时间)
(不例外)WireShark结果:
测试1(不使用):可达的Ip - >数据被捕获,见 测试2(不使用):无法访问的IP->没有数据。
三秒延迟的意思是什么?
我不确定,但我认为我必须使用“使用”块,因为如果我不使用块内存使用将增加非常高的阶段。
两个代码有什么区别?哪一个更可靠?有没有更好的方法?我不想要三秒钟的延迟。
如何将三秒延迟减少到零?
提前致谢...
新结果
我已尝试使用Python编程对无法访问的IP进行套接字关闭/处理 Windows操作系统中的语言。我得到了相同的结果,即三秒延迟无法到达 IP。但是当我在Ubuntu 15.10中尝试相同的Python代码时,我没有得到 三秒钟的延迟。
import socket
import datetime
IPADDR = '192.168.1.141'
PORTNUM = 5600
PACKETDATA = "f1a525da11f6".encode()
while(True):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
s.connect((IPADDR, PORTNUM))
s.send(PACKETDATA)
print(datetime.datetime.now())
s.close()
答案 0 :(得分:4)
您的UdpClient是一次性对象。在重新连接之前,您应该将其丢弃。
using (var client = new UdpClient()){
//Please check IP address, It must be unreachable...
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("192.168.1.41"), 5600);
client.Connect(ep);
client.Send(data, data.Length);
}
或移动循环外的连接以重用相同的连接。
答案 1 :(得分:2)
实际的区别是在第二个代码中Dispose()
上没有调用client
方法。但是Dispose()
在using (var client = new UdpClient())
的第一个代码中被调用。在尝试连接无法访问的IP地址后调用Dispose()
方法需要3秒的额外时间。
如下所示,您可以通过SECOND CODE注意打印最后一个标签的延迟。延迟是由Dispose
引起的。必须在try块上方声明client
以在finally
块中使用它。
finally
{
if (client != null)
((IDisposable)client).Dispose();
}
Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt"));
我还注意到,如果无法访问的IP地址超出域,则不会导致延迟。例如,如果我的PC的IP为192.168.1.20
,并且我尝试访问202.22.1.88
,则看不到延迟。
结论是:延迟是由Dispose()
引起的。但是应该进一步研究Dispose()
的行为。
答案 2 :(得分:0)
将三秒延迟减少到零解决方案1(与ThreadPool一起使用):
while (true)
{
Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt"));
try
{
ThreadPool.QueueUserWorkItem(state =>
{
using (var client = new UdpClient())
{
client.Send(data, data.Length, "192.168.1.145", 55600);
}
});
Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt"));
Console.WriteLine(" ");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
System.Threading.Thread.Sleep(1000); // to see easily
}
将三秒延迟减少到零解决方案1(client = null):
while (true)
{
Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt"));
try
{
var client = new UdpClient();
client.Send(data, data.Length, "192.168.1.145", 55600);
client = null;
Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt"));
Console.WriteLine(" ");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
System.Threading.Thread.Sleep(1000); // to see easily
}