私は正常に動作するこのTcpClientコードを持っています。Linuxシステム上のperlサーバーに接続し、サーバーが送信したものをすべて受信します。うまく動作します。
public static void Main() {
foreach (ProtocolConnection tcpConnection in TcpConnectionsList) {
ProtocolConnection connection = tcpConnection;
ThreadPool.QueueUserWorkItem(_ => {
ThreadTcpClient(connection);
ManualResetEventTcp.Set();
});
}
... Some code...
}
public static void TcpConnect(ProtocolConnection varConnection) {
int retryCountSeconds = varConnection.RetryEverySeconds*Program.MilisecondsMultiplier;
int count = 0;
while (true) {
try {
using (var client = new TcpClient(varConnection.IpAddress.ToString(), varConnection.Port) { NoDelay = true })
using (var stream = client.GetStream()) {
var data = new Byte[256];
while (!Program.PrepareExit) {
Int32 bytes = stream.Read(data, 0, data.Length);
string varReadData = Encoding.ASCII.GetString(data, 0, bytes).Trim();
if (varReadData != "" && varReadData != "PONG") {
VerificationQueue.EnqueueData(varReadData);
Logging.AddToLog("[TCP][" + varConnection.Name + "][DATA ARRIVED]" + varReadData);
} else {
Logging.AddToLog("[TCP]" + varReadData);
}
}
}
} catch (Exception e) {
if (e.ToString().Contains("No connection could be made because the target machine actively refused it")) {
Logging.AddToLog("[TCP][ERROR] Can't connect to server (" + varConnection.Name + ") " + varConnection.IpAddress + ":" + varConnection.Port );
} else {
Logging.AddToLog(e.ToString());
}
}
DateTime startTimeFunction = DateTime.Now;
do {
Thread.Sleep(1000);
} while (((DateTime.Now - startTimeFunction).TotalSeconds < retryCountSeconds));
}
}
ただし、特定の条件では、いくつかの問題が発生しています。
- 私の仕事用接続はアイドル時間の後に接続を切断することが多いので、サーバーに実装したので、PINGを受信するとPONGで応答します。UDPを使用してPINGをサーバーに送信でき、tcpでPONGで応答しますが、60秒ごとにPINGを送信するように、tcpクライアントに組み込まれた方法を使用することをお勧めします。UDPソリューションが受け入れられるとしても、タイムアウトは
string varReadData = Encoding.ASCII.GetString(data, 0, bytes).Trim();
発生しないため、PONGが到着しない場合、クライアントはとにかくそれに気づきません。それはただ待ち続けます...それは私を連れて来ます.. - 私の他の問題は、ある時点で
string varReadData = Encoding.ASCII.GetString(data, 0, bytes).Trim();
これが常にデータを待機していることです。サーバーがクラッシュしたり、クライアントを切断したりしても、気づきません。サーバーに何らかの機能を持たせtimeout
たり、接続がアクティブかどうかを確認したりしたいのですが。アクティブでない場合は、再接続を試みる必要があります。
このTcpClientを修正する最も簡単な方法は何でしょうか?サーバーが接続を切断したり、ネットが切断されたりした場合にクライアントがそれに気づき、接続を再確立することを確認するために、双方向通信を実装するにはどうすればよいですか?