Windows操作系统中无法访问的IP套接字关闭时间

时间:2017-06-22 08:25:38

标签: c# python sockets ubuntu udp

这些代码通过用户数据报协议提供发送数据。下面有两个代码。当我使用第一个代码来获取无法访问的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()

3 个答案:

答案 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
}