C# Windows操作系统中无法访问的IP套接字关闭时间
这些代码通过用户数据报协议提供发送数据。下面有两个代码。当我将第一个代码用于无法访问的Ip地址时,我得到了三秒钟的延迟C# Windows操作系统中无法访问的IP套接字关闭时间,c#,python,sockets,ubuntu,udp,C#,Python,Sockets,Ubuntu,Udp,这些代码通过用户数据报协议提供发送数据。下面有两个代码。当我将第一个代码用于无法访问的Ip地址时,我得到了三秒钟的延迟 请查看新的结果标题 只需打开新的C#控制台应用程序并将这些代码粘贴到其中。(第一个代码) 测试1(使用):可访问IP 测试2(使用):无法访问的IP 输出: Test1label1--->h:mm:ss label2--->h:mm:ss(同时) Test2label1-->h:mm:ss label2-->h:mm:ss+3秒 (无例外) WireShark结果: 测试1
请查看新的结果标题
只需打开新的C#控制台应用程序并将这些代码粘贴到其中。(第一个代码) 测试1(使用):可访问IP
测试2(使用):无法访问的IP
输出:
Test1label1--->h:mm:ss label2--->h:mm:ss(同时)
Test2label1-->h:mm:ss label2-->h:mm:ss+3秒
(无例外) WireShark结果:
测试1(使用):捕获、查看可访问的Ip-->数据。
测试2(使用):无法访问IP->无数据 当我在没有使用积木的情况下使用积木时,我没有得到三秒钟的时间 耽搁 只需打开新的C#控制台应用程序并将这些代码粘贴到其中。(第二个代码) 测试1(不使用):可访问Ip
测试2(不使用):无法访问的Ip 输出:
Test1label1--->h:mm:ss(同一时间)label2--->h:mm:ss(同一时间)
Test2label1--->h:mm:ss(同一时间)label2--->h:mm:ss(同一时间)
(无例外) WireShark结果:
测试1(不使用):捕获、查看可访问的Ip-->数据。
测试2(不使用):无法访问IP->无数据 这三秒钟的延迟意味着什么?
我不确定,但我认为我必须使用“using”块,因为如果我不使用这些块,内存使用率将非常高。 这两种代码之间的区别是什么?哪个更可靠?还有更好的办法吗?我不想耽搁三秒钟 如何将三秒延迟减少到零? 先谢谢你
新结果 我已经尝试过用Python编程来关闭/释放无法访问的IP套接字 Windows操作系统中的语言。我得到了同样的结果,即三秒钟的延迟 知识产权。但当我在Ubuntu15.10中尝试相同的Python代码时,我并没有得到任何帮助 三秒钟的延迟
您的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);
}
或者将连接移到循环外部以重用相同的连接。实际的区别在于,在第二个代码中,
客户端
上未调用Dispose()
方法。但是Dispose()
在第一个代码中使用调用(var client=new UdpClient())
。尝试连接无法访问的IP地址后调用Dispose()
方法需要额外3秒的时间
您可以按下面的第二个代码来注意打印最后一个标签的延迟。延迟是由Dispose
引起的。必须在try块上方声明客户端
,才能在finally
块中使用它
finally
{
if (client != null)
((IDisposable)client).Dispose();
}
Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt"));
我还注意到,若无法访问的IP地址在域外,则不会导致延迟。例如,如果我的电脑的IP是192.168.1.20
,我尝试访问202.22.1.88
,则看不到延迟
结论是:延迟是由
Dispose()
引起的。但是应该进一步研究Dispose()
的行为 将三秒延迟减为零解决方案1(与ThreadPool一起使用):
将三秒延迟减为零解决方案1(客户端=null):
请格式化代码,适当缩进。阅读不揭示其结构的代码非常困难。请提供可复制的示例。根据您提供的示例,我无法重现dispose\close上的延迟。非常感谢。我更新了密码。普拉斯,再复习一遍。只需在新的控制台应用程序中复制代码。Thx提前@等我有时间的时候,埃夫基会看一看,但仅仅因为我建议你如何改进这个问题并不一定意味着我就能解决它。(与其说“将代码粘贴到一个新的控制台应用程序中”,不如说包含所有的代码,这样我们就可以复制/粘贴到一个全新的文件中,编译并运行……)这需要一些时间才能结束,因为发送缓冲区中有挂起的数据(我想),但我不知道如何防止。对于TCP套接字,您可以使用Linger套接字选项立即关闭套接字,而无需等待,但对于UDP套接字,这似乎不适用。谢谢您的回答。我知道延迟三秒钟的原因。但是我不知道如何取消三秒钟的延迟。该问题与Windows操作系统有关。Bcz I在使用Python代码时也面临同样的三秒钟延迟。但是我没有使用Ubuntu….
UdpClient.Dispose()
方法调用的InternalShutDown()
和Close()
。有关更多详细信息,请参阅调用非托管函数。谢谢您的回答。若你们看上面的“新结果”标题。您可以在Windows中看到Python代码同样的三秒延迟。问题与Windows操作系统有关@彼得
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()
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);
}
finally
{
if (client != null)
((IDisposable)client).Dispose();
}
Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt"));
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
}
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
}