日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TcpClient.Connect函数连接超时的问题(转载)

發布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TcpClient.Connect函数连接超时的问题(转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TcpClient.Connect函數連接超時的問題

問題原述:

http://topic.csdn.net/t/20060616/15/4825920.html

調用TcpClient.Connect函數連接其他機器。我在一臺機器上測試程序,對于連接根本無法連接(物理連接不通)的機器,該函數用時5秒左右返回,并捕獲SocketException異常。我在另一臺機器上測試時,Connect函數用時26秒左右的時間才返回。請問有沒有方法設置Connect函數連接超時的時間,如果超過一定時間還沒有連上則返回。

解決方法:

?? 寫了個幫助類,用了線程池 ?
? ?
? class ? TcpClientConnector ?
? { ?
? ? ? ? ? /// ? <summary> ?
? ? ? ? ? /// ? 在指定時間內嘗試連接指定主機上的指定端口。 ?
? ? ? ? ? /// ? </summary> ?
? ? ? ? ? /// ? <param ? name="hostname">要連接到的遠程主機的 ? DNS ? 名。</param> ?
? ? ? ? ? /// ? <param ? name="port">要連接到的遠程主機的端口號。</param> ?
? ? ? ? ? /// ? <param ? name="millisecondsTimeout">要等待的毫秒數,或 ? -1 ? 表示無限期等待。</param> ?
? ? ? ? ? /// ? <returns>已連接的一個 ? TcpClient ? 實例。</returns> ?
? ? ? ? ? /// ? <remarks>本方法可能拋出的異常與 ? TcpClient ? 的構造函數重載之一 ?
? ? ? ? ? /// ? public ? TcpClient(string, ? int) ? 相同,并若指定的等待時間是個負數且不等于 ?
? ? ? ? ? /// ? -1,將會拋出 ? ArgumentOutOfRangeException。</remarks> ?
? ? ? ? ? public ? static ? TcpClient ? Connect(string ? hostname, ? int ? port, ? int ? millisecondsTimeout) ?
? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ConnectorState ? cs ? = ? new ? ConnectorState(); ?
? ? ? ? ? ? ? ? ? cs.Hostname ? = ? hostname; ?
? ? ? ? ? ? ? ? ? cs.Port ? = ? port; ?
? ? ? ? ? ? ? ? ? ThreadPool.QueueUserWorkItem(new ? WaitCallback(ConnectThreaded), ? cs); ?
? ? ? ? ? ? ? ? ? if ? (cs.Completed.WaitOne(millisecondsTimeout, ? false)) ?
? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? if ? (cs.TcpClient ? != ? null) ? return ? cs.TcpClient; ?
? ? ? ? ? ? ? ? ? ? ? ? ? throw ? cs.Exception; ?
? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? else ?
? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? cs.Abort(); ?
? ? ? ? ? ? ? ? ? ? ? ? ? throw ? new ? SocketException(11001); ? // ? cannot ? connect ?
? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? } ?
? ?
? ? ? ? ? private ? static ? void ? ConnectThreaded(object ? state) ?
? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ConnectorState ? cs ? = ? (ConnectorState)state; ?
? ? ? ? ? ? ? ? ? cs.Thread ? = ? Thread.CurrentThread; ?
? ? ? ? ? ? ? ? ? try ?
? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? TcpClient ? tc ? = ? new ? TcpClient(cs.Hostname, ? cs.Port); ?
? ? ? ? ? ? ? ? ? ? ? ? ? if ? (cs.Aborted) ?
? ? ? ? ? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? try ? { ? tc.GetStream().Close(); ? } ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? catch ? { ? } ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? try ? { ? tc.Close(); ? } ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? catch ? { ? } ?
? ? ? ? ? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? ? ? ? ? else ?
? ? ? ? ? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cs.TcpClient ? = ? tc; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? cs.Completed.Set(); ?
? ? ? ? ? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? catch ? (Exception ? e) ?
? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? cs.Exception ? = ? e; ?
? ? ? ? ? ? ? ? ? ? ? ? ? cs.Completed.Set(); ?
? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? } ?
? ?
? ? ? ? ? private ? class ? ConnectorState ?
? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? public ? string ? Hostname; ?
? ? ? ? ? ? ? ? ? public ? int ? Port; ?
? ? ? ? ? ? ? ? ? public ? volatile ? Thread ? Thread; ?
? ? ? ? ? ? ? ? ? public ? readonly ? ManualResetEvent ? Completed ? = ? new ? ManualResetEvent(false); ?
? ? ? ? ? ? ? ? ? public ? volatile ? TcpClient ? TcpClient; ?
? ? ? ? ? ? ? ? ? public ? volatile ? Exception ? Exception; ?
? ? ? ? ? ? ? ? ? public ? volatile ? bool ? Aborted; ?
? ? ? ? ? ? ? ? ? public ? void ? Abort() ?
? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? if ? (Aborted ? != ? true) ?
? ? ? ? ? ? ? ? ? ? ? ? ? { ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Aborted ? = ? true; ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? try ? { ? Thread.Abort(); ? } ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? catch ? { ? } ?
? ? ? ? ? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? ? ? ? ? } ?
? ? ? ? ? } ?
? } ?
? ?
? ================================= ?
? 用法示例: ?
? ?
? try ?
? { ?
? ? ? ? ? Console.WriteLine("Connecting ? to ? nonexistenthost..."); ?
? ? ? ? ? TcpClient ? tc ? = ? TcpClientConnector.Connect("nonexistent", ? 80, ? 1000); ?
? ? ? ? ? Console.WriteLine("Returned"); ?
? ? ? ? ? try ? { ? tc.GetStream().Close(); ? } ?
? ? ? ? ? catch ? { ? } ?
? ? ? ? ? try ? { ? tc.Close(); ? } ?
? ? ? ? ? catch ? { ? } ?
? } ?
? catch ? (Exception ? e) ?
? { ?
? ? ? ? ? Console.WriteLine("Exception: ? " ? + ? e.Message); ?
? }??

轉載于:https://www.cnblogs.com/sql4me/archive/2009/04/29/1446080.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的TcpClient.Connect函数连接超时的问题(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。