クライアント TCP/IP アプリケーションでSocketクラスを使用して、クライアントをサーバーに接続しています。
次のコードがあります。
var endPoint = new IPEndPoint(IPAddress.Parse(IP), port);
var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
client.Connect(endPoint);
try
{
while (true)
{
// Do work...
// Receive/Send data from/to server
}
}
catch (SocketException)
{
/* At some point the server disconnects...
Exception catched because the server close the connection
Socket error 10054 - WSAECONNRESET */
// So I try to reconnect
if(client.Connected == false)
{
/* The following line throws a InvalidOperationException.
Message: After disconnecting the socket, you can reconnect only
asynchronously from a different EndPoint. BeginConnect must be
called on a thread that will not close until the operation completes.*/
client.Connect(endPoint);
/* So I try instead Socket.BeginConnect, but the following line
throws a SocketException 10061 - WSAECONNREFUSED */
client.BeginConnect(endPoint, ConnectCallback, client);
/* And also the following code throws a
SocketException 10061 - WSAECONNREFUSED */
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
client.Connect(endPoint);
}
}
ここにソケットエラーのリストがあります。
そのため、ある時点でサーバーが接続を閉じるとき、サーバーが別の接続を受け入れる準備ができていることを知るための最良の方法と、同じエンドポイントに再度接続する方法を知る必要があります。