C# Socket連接請(qǐng)求超時(shí)機(jī)制實(shí)現(xiàn)代碼分享
.Net的System.Net.Sockets.TcpClient和System.Net.Sockets.Socket都沒(méi)有直接為Connect/BeginConnect提供超時(shí)控制機(jī)制。因此,或者發(fā)生網(wǎng)絡(luò)故障時(shí),客戶端連接請(qǐng)求會(huì)等待很長(zhǎng)一段時(shí)間,直到拋出異常。默認(rèn)的等待時(shí)間長(zhǎng)達(dá)20~30s。.Net Socket庫(kù)的SocketOptionName.SendTimeout提供了控制發(fā)送數(shù)據(jù)的超時(shí)時(shí)間,但并非本文討論的連接請(qǐng)求的超時(shí)時(shí)間。
實(shí)現(xiàn)
下面是實(shí)現(xiàn)的關(guān)鍵代碼:
class TimeOutSocket
{
private static bool IsConnectionSuccessful = false;
private static Exception socketexception;
private static ManualResetEvent TimeoutObject = new ManualResetEvent(false);
public static TcpClient TryConnect(IPEndPoint remoteEndPoint, int timeoutMiliSecond)
{
TimeoutObject.Reset();
socketexception = null;
string serverip = Convert.ToString(remoteEndPoint.Address);
int serverport = remoteEndPoint.Port;
TcpClient tcpclient = new TcpClient();
tcpclient.BeginConnect(serverip, serverport,
new AsyncCallback(CallBackMethod), tcpclient);
if (TimeoutObject.WaitOne(timeoutMiliSecond, false))
{
if (IsConnectionSuccessful)
{
return tcpclient;
}
else
{
throw socketexception;
}
}
else
{
tcpclient.Close();
throw new TimeoutException("TimeOut Exception");
}
}
private static void CallBackMethod(IAsyncResult asyncresult)
{
try
{
IsConnectionSuccessful = false;
TcpClient tcpclient = asyncresult.AsyncState as TcpClient;
if (tcpclient.Client != null)
{
tcpclient.EndConnect(asyncresult);
IsConnectionSuccessful = true;
}
}
catch (Exception ex)
{
IsConnectionSuccessful = false;
socketexception = ex;
}
finally
{
TimeoutObject.Set();
}
}
}
相關(guān)文章
深入解析C#設(shè)計(jì)模式編程中對(duì)建造者模式的運(yùn)用
這篇文章主要介紹了C#設(shè)計(jì)模式編程中對(duì)建造者模式的運(yùn)用,文中還介紹了在.NET框架下建造者模式編寫思路的實(shí)現(xiàn),需要的朋友可以參考下2016-02-02
在.NET項(xiàng)目中嵌入Python代碼的實(shí)踐指南
在現(xiàn)代開(kāi)發(fā)中,.NET 與 Python 的協(xié)作需求日益增長(zhǎng),從機(jī)器學(xué)習(xí)模型集成到科學(xué)計(jì)算,從腳本自動(dòng)化到數(shù)據(jù)分析,然而,傳統(tǒng)的解決方案(如 HTTP API 或進(jìn)程間通信)往往帶來(lái)性能損耗和復(fù)雜架構(gòu),所以本文給大家介紹了在.NET項(xiàng)目中嵌入Python代碼的方法,需要的朋友可以參考下2025-08-08
winform實(shí)現(xiàn)拖動(dòng)文件到窗體上的方法
這篇文章主要介紹了winform實(shí)現(xiàn)拖動(dòng)文件到窗體上的方法,以實(shí)例分析了C#中WinForm操作窗體及文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
c#動(dòng)態(tài)調(diào)用Webservice的兩種方法實(shí)例
這篇文章介紹了c#動(dòng)態(tài)調(diào)用Webservice的兩種方法實(shí)例,有需要的朋友可以參考一下2013-08-08
C#編程實(shí)現(xiàn)動(dòng)態(tài)改變配置文件信息的方法
這篇文章主要介紹了C#編程實(shí)現(xiàn)動(dòng)態(tài)改變配置文件信息的方法,涉及C#針對(duì)xml格式文件的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06

