我在做一个用于局域网内的管理程序,通信使用的是 TcpListener 和 TcpClient 类,但是在客户端创建连接的时候要花上十多秒,已经确定问题出在 TcpClient 的创建上,代码是这样的:tcpClient = new TcpClient("192.168.0.1", 19999);这个步骤要花去十多秒,原因是在 TcpClient 的 constructor 里调用了 TcpClient.Connect 方法,而 TcpClient.Connect 方法又调用了 Dns.Resolve 方法来解析传入的字串地址,时间主要是花在这个方法上的。当解析的字串是主机别名如 "www.csdn.net" 的时候这个花费的时间或许还可以理解(不过同样无法忍受),但是解析诸如 "192.168.0.1" 这种静态的 ip 字串也要花上那么久时间就有点忍无可忍了。我试过用 winapi 的时候用 socket 函数集里的 inet_addr(char*) 函数来转换字串形式的 ip 地址然后直接创建 socket 和进行连接,这个过程几乎是 0 延迟完成的。而 TcpClient 的其他 constructor 中,TcpClient() 和 TcpClient(AddressFamily) 都不会在构造的时候创建连接,必须显式调用 Connect 方法;TcpClient(string, int) 是我现在用的方法,这个在使用上最为方便,但是太花时间;TcpClient(IPEndPoint) 接收一个 IPEndPoint 辅助类然后创建连接。但是,无论是显式调用 Connect 还是传入 IPEndPoint 都要先把 ip 地址的字串转换为 .Net 的 socket 封装可以支持的辅助类(IPAddress 或者 IPEndPoint )才行。我想知道除了 Dns.Resolve 方法可以转换静态的 ip 地址字串和自己 code 一个专用的方法之外,还有其他的方法可以用么?

解决方案 »

  1.   

    IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("192.168.0.1"),19999);
    TcpClient =tcpClient = new TcpClient(ipe);
      

  2.   

    TcpClient tcpClient = new TcpClient(ipe);昏,在这句被抛出个异常未处理的“System.Net.Sockets.SocketException”类型的异常出现在 system.dll 中。其他信息: 在其上下文中,该请求的地址无效。ps. 在我的机器上调试的时候,每当出现异常之后被调试的程序就失去反应,然后总是要隔上几秒到十几秒才被 vs2003 捕捉到,这到底是怎么回事-_-?其他人也是这样的么?
      

  3.   

    口古月,但是这种写法就能连上,快抓狂鸟tcpClient = new TcpClient("192.168.0.1", 19999);