Browse Source

TcpClient 支持指定连接超时毫秒数。

master
王厅 7 days ago
parent
commit
f65f1c0e1c
  1. 81
      Apewer/Network/TcpClient.cs

81
Apewer/Network/TcpClient.cs

@ -24,19 +24,86 @@ namespace Apewer.Network
public IPEndPoint RemoteEndPoint { get; private set; } public IPEndPoint RemoteEndPoint { get; private set; }
/// <summary>启动客户端,并连接到服务端。</summary> /// <summary>启动客户端,并连接到服务端。</summary>
public TcpClient(string ip, int port) : this(IPAddress.Parse(ip), port) { } /// <param name="ip">远程 IP 地址。</param>
/// <param name="port">远程端口号。</param>
/// <exception cref="ArgumentOutOfRangeException" />
/// <exception cref="FormatException" />
/// <exception cref="SocketException" />
public TcpClient(string ip, int port) : this(new IPEndPoint(IPAddress.Parse(ip), port), 0) { }
/// <summary>启动客户端,并连接到服务端。</summary> /// <summary>启动客户端,并连接到服务端。</summary>
public TcpClient(IPAddress address, int port) : this(new IPEndPoint(address, port)) { } /// <param name="ip">远程 IP 地址。</param>
/// <param name="port">远程端口号。</param>
/// <param name="timeout">连接超时毫秒数。当达到指定时长,或达到系统默认时长时,将会发生超时异常。</param>
/// <exception cref="ArgumentOutOfRangeException" />
/// <exception cref="FormatException" />
/// <exception cref="SocketException" />
public TcpClient(string ip, int port, int timeout) : this(new IPEndPoint(IPAddress.Parse(ip), port), timeout) { }
/// <summary>启动客户端,并连接到服务端。</summary> /// <summary>启动客户端,并连接到服务端。</summary>
public TcpClient(IPEndPoint endpoint) /// <param name="ip">远程 IP 地址。</param>
/// <param name="port">远程端口号。</param>
/// <exception cref="ArgumentNullException" />
/// <exception cref="ArgumentOutOfRangeException" />
/// <exception cref="SocketException" />
public TcpClient(IPAddress ip, int port) : this(new IPEndPoint(ip, port), 0) { }
/// <summary>启动客户端,并连接到服务端。</summary>
/// <param name="ip">远程 IP 地址。</param>
/// <param name="port">远程端口号。</param>
/// <param name="timeout">连接超时毫秒数。当达到指定时长,或达到系统默认时长时,将会发生超时异常。</param>
/// <exception cref="ArgumentNullException" />
/// <exception cref="ArgumentOutOfRangeException" />
/// <exception cref="SocketException" />
public TcpClient(IPAddress ip, int port, int timeout) : this(new IPEndPoint(ip, port), timeout) { }
/// <summary>启动客户端,并连接到服务端。</summary>
public TcpClient(IPEndPoint endpoint) : this(endpoint, 0) { }
/// <summary>启动客户端,并连接到服务端。</summary>
/// <param name="endpoint">远程终结点。</param>
/// <param name="timeout">连接超时毫秒数。当达到指定时长,或达到系统默认时长时,将会发生超时异常。</param>
/// <exception cref="ArgumentNullException" />
/// <exception cref="ArgumentOutOfRangeException" />
/// <exception cref="SocketException" />
public TcpClient(IPEndPoint endpoint, int timeout)
{ {
if (endpoint == null) throw new ArgumentNullException(nameof(endpoint));
if (timeout < 1) throw new ArgumentOutOfRangeException(nameof(timeout));
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_socket.Connect(endpoint); if (timeout > 0)
_socket.SendTimeout = 5000; {
LocalEndPoint = _socket.LocalEndPoint as IPEndPoint; RuntimeUtility.InBackground(timeout, () =>
RemoteEndPoint = endpoint; {
if (!_socket.Connected)
{
_socket.Close();
#if !NET20
_socket.Dispose();
#endif
}
}, true);
}
try
{
_socket.Connect(endpoint);
_socket.SendTimeout = 5000;
LocalEndPoint = _socket.LocalEndPoint as IPEndPoint;
RemoteEndPoint = endpoint;
}
catch (SocketException ex)
{
if (ex.SocketErrorCode == SocketError.NotSocket)
{
throw new SocketException((int)SocketError.TimedOut);
}
throw new Exception($"{ex.ErrorCode} {ex.SocketErrorCode}: {ex.Message}");
}
catch
{
throw;
}
} }
/// <summary>关闭连接,释放系统资源。</summary> /// <summary>关闭连接,释放系统资源。</summary>

Loading…
Cancel
Save