Я не могу поделиться кодом сервера, так как он находится внутри устройства шифрования, к которому у меня тоже нет доступа, и не задокументировано.
В этом сценарии я и отправляю команду на устройство шифрования через сокет внутри цикла. Устройство шифрования обрабатывает команду сокета и в случае успеха передает команду на принтер.
Сценарий 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 команд. Это также будет работать, как и ожидалось, если я помещу в недопустимо длинный сон после каждой итерации в цикле. Это заставляет меня поверить, что это связано с моим недостатком знаний, а не с их устройством.
Я довольно новичок в программировании сокетов, есть ли что-то, что я не правильно понимаю на моем клиенте, что вызывает такое поведение?