特定のクライアントからデータを受信するサービスを作成しました。これは正常に機能し、必要なデータのほとんどを受信できません。ただし、接続の2〜4時間後に、StreamReader.ReadLineでこのエラーが発生します。このエラーが発生した後、サービスはCPUの90〜99%を使用し始め、cmdとTaskkillを使用してのみ閉じることができます。
System.IO.IOException:トランスポート接続からデータを読み取れません:既存の接続がリモートホストによって強制的に閉じられました。---> System.Net.Sockets.SocketException:既存の接続がSystem.Net.Sockets.Socket.Receive(Byte [] buffer、Int32 offset、Int32 size、SocketFlags socketFlags)のリモートホストによって強制的に閉じられました。 Net.Sockets.NetworkStream.Read(Byte [] buffer、Int32 offset、Int32 size)---内部例外スタックトレースの終わり--- System.Net.Sockets.NetworkStream.Read(Byte [] buffer、Int32 offset、 Int32サイズ)at System.IO.StreamReader.ReadBuffer()at System.IO.StreamReader.ReadLine()
接続のコード:
static readonly object _lock = new object();
List<Task> _connections = new List<Task>();
private static string strConn;
private static int _port;
public async Task connectClients()
{
TcpListener ServerSocket = new TcpListener(IPAddress.Any, _port);
ServerSocket.Start();
while (true)
{
TcpClient client = await ServerSocket.AcceptTcpClientAsync();
var task = handle_clients(client);
if (task.IsFaulted)
task.Wait();
}
}
private async Task handle_clients(TcpClient client)
{
var connectionTask = HandleConnectionAsync(client);
lock (_lock)
_connections.Add(connectionTask);
try
{
await connectionTask;
}
catch (Exception ex)
{
new LogWriter(ex.ToString());
}
finally
{
// remove pending task
lock (_lock)
{
_connections.Remove(connectionTask);
client.GetStream().Close();
client.Close();
}
}
}
private async Task HandleConnectionAsync(TcpClient client)
{
await Task.Yield();
NetworkStream stream = client.GetStream();
StreamReader reader = new StreamReader(stream);
while (true)
{
try
{
string data = reader.ReadLine();
if (!string.IsNullOrWhiteSpace(data))
{
Thread t = new Thread(() => DatabaseFix(data));
t.Start();
}
}
catch (Exception ex)
{
new LogWriter(ex.ToString());
break;
}
}
}
では、何らかの理由で接続が閉じられたときに何が起こると予想しますか?接続をシャットダウンしてから、新しい接続を取得する必要がありますか?
これは、クライアントとサービス間のインターネットエラー「ファイアウォール」である可能性がありますか?この場合、エラーは何でしょうか?
興味のある人のために。問題は、クライアントが接続を送信し続け、送信するデータが得られるまで接続を再び閉じることでした。クライアント接続でエラーが発生したときに、コードがネットワークストリームをシャットダウンしませんでした。
HandleConnectionAsyncをこれに変更しました。
try
{
using (var stream = client.GetStream())
using (var reader = new StreamReader(stream))
{
while (true)
{
var data = await reader.ReadLineAsync();
if (string.IsNullOrEmpty(data))
{
break;
}
DatabaseFix(data);
}
}
}
catch (Exception ex)
{
new LogWriter(ex.ToString());
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加