C#中Socket的连接超时设置中,SendTimeout,ReceiveTimeout根本不起作用。开始本来准备通过c#中ping命令去判断服务器连接是否正常的,但是同样存在问题。如果服务器正常运作,而socket服务程序意外终止,那么客户端依然会认为socket服务程序连接正常,从而建立连接。这样连接一个已经终止的socket服务程序,导致可能需要等待10~20秒钟才能返回结果。极大的降低了用户体验效果。为此找到了以下方法解决这一问题。以下代码可能并不完美,比如如果在客户端连接成功后,网络突然中断,同样会造成客户端连接请求等待。希望有更好解决方法者,予以指教!
private readonly ManualResetEvent TimeoutObject = new ManualResetEvent(false);
/// <summary>
/// 连接超时设置
/// </summary>
/// <param name="remoteEndPoint">ip</param>
/// <param name="timeoutMSec">超时时间</param>
/// <returns></returns>
public bool SocketConnect(IPEndPoint remoteEndPoint, int timeout)
{
bool is_ok = false;
TimeoutObject.Reset();
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.BeginConnect(remoteEndPoint, CallBackMethod, socket);
//阻塞当前线程,使其等待异步连接,如果在指定时间内
if (TimeoutObject.WaitOne(timeout, false))
{
is_ok = true;//连接正常
}
else
{
is_ok = false;//连接中断
}
if (socket.Connected)
{
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
return is_ok;
}
/// <summary>
/// 异步回调方法
/// </summary>
/// <param name="asyncresult"></param>
public void CallBackMethod(IAsyncResult ar)
{
//终止等待,使阻塞的线程继续
TimeoutObject.Set();
}