Я пишу небольшое (C #) клиентское приложение, которое отправляет данные с использованием соединения TCP / IP на удаленный сервер.Я использую стандартный объект .Net TcpClient и хочу оставить соединение открытым со стороны клиента, так как я регулярно отправляю пакеты данных на сервер.Однако возможно, что сервер может закрыть соединение, и в этом случае мне нужно знать, чтобы повторно подключиться перед отправкой моего следующего пакета.
Используя Wireshark, я вижу (только) следующий диалог, когдасервер прерывает соединение:
server >>> FIN, ACK<br> ACK <<< client
Что я делаю не . Видит, мой клиент отвечает собственным FIN, чтобы завершить отключение соединения.В результате моя клиентская программа обнаруживает, что соединение отключено только после отправки следующего пакета данных.
Можно ли каким-либо образом настроить TcpClient или его основной сокет, чтобы завершить отключение, и предоставитькакая-то обратная связь, чтобы мой клиентский код знал о повторном подключении перед отправкой следующего пакета?
Добавлено в ответ на комментарий ниже: Мой код отправки очень прост - объект, который поддерживает TcpClientи переменные-члены NetworkStream, имеет функцию-член, содержащую (по существу) следующее:
bool sent = false;
byte[] buffer = Encoding.UTF8.GetBytes(dataString);
while (!sent)
{
try
{
m_outStream.Write(buffer, 0, buffer.Length);
sent = true;
}
catch (Exception ex)
{
if (m_outStream != null) { m_outStream.Dispose(); }
m_client = new TcpClient(AddressFamily.InterNetwork);
m_client.Connect(ipAddress, ipPort);
m_outStream = m_client.GetStream();
}
}
С инициализированными m_client и m_outStream это просто выполняет один проход каждый раз.Затем, используя Wireshark, я вижу, как сервер отправляет пакет с флагами FIN, ACK
, на который клиент отвечает ACK
.
В следующий раз, когда я вызываю свою функцию, данные отправляются с PSH, ACK
,и сервер отвечает RST, ACK
, но не читает входящие данные.Клиент не вызывает никаких исключений.
Затем я вызываю свою функцию во второй раз, и возникает исключение, вызывающее перезапуск соединения.