Почему открытие и закрытие сокета приводит к потере данных? - PullRequest
0 голосов
/ 29 августа 2018

Я не могу поделиться кодом сервера, так как он находится внутри устройства шифрования, к которому у меня тоже нет доступа, и не задокументировано.

В этом сценарии я и отправляю команду на устройство шифрования через сокет внутри цикла. Устройство шифрования обрабатывает команду сокета и в случае успеха передает команду на принтер.

Сценарий 1

for (int i = 1; i <= 10; i++)
{
     // Step 1. Initialize TcpClient stream
     m_client = new TcpClient();
     m_client.Client.ExclusiveAddressUse = false;
     m_client.ReceiveTimeout = 20000;
     m_client.SendTimeout = 20000;
     m_client.Connect(SrmIp, Port); 
     m_stream = new SslStream(m_client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);
     m_stream.AuthenticateAsClient("MEV", null, SslProtocols.Tls, false);


     // Step 2. Write data command
     m_stream.Write(aTaille, 0, aTaille.Length);
     m_stream.Write(SrmCheckData, 0, SrmCheckData.Length);

     // Step 3. Receive the status response from the encryption device
     int status = ReceiveReturnCode(true);
     if (status != 2)
          throw new Exception("Encryption Error");

     // Step 4.Close the stream
     m_stream.Close();
}

В приведенном выше Сценарий 1 я не получаю потоковых ошибок. Документально подтверждено, что устройство отправит обратно 2 , если команда была успешно обработана. В Шаг 3 я проверяю это и никогда не получаю исключение, указывающее, что устройство получило все 10 моих команд.

Моя проблема в том, что кажется, что устройство полностью обрабатывает только 5 из 10 команд. Только половина из них направляется на принтер.

Если я вывожу все за пределы цикла, не закрываю и не открываю сокет каждый раз, когда устройство полностью обрабатывает все 10 команд. Это также будет работать, как и ожидалось, если я помещу в недопустимо длинный сон после каждой итерации в цикле. Это заставляет меня поверить, что это связано с моим недостатком знаний, а не с их устройством.

Я довольно новичок в программировании сокетов, есть ли что-то, что я не правильно понимаю на моем клиенте, что вызывает такое поведение?

...