Я работаю над проектом, где большая часть кода — C ++. В долгосрочной перспективе магазин переходит на C #, поэтому, где это возможно, мы создаем новый код на C # и открываем C ++ через COM.
Я обернул System.Net.Sockets.SslStream и немного другой функциональности в COM-объект, предназначенный для отправки, а затем получения сообщений. При вызове функций этого класса из тестовой программы на C # я могу отправлять и получать сообщения без проблем. Похоже, что выполнение тех же вызовов, которые предоставляются через COM, также работает, за исключением того, что я не могу получить данные сразу после отправки.
Из теста C # данные отправляются и получают довольно быстро, и я получаю ответы, которые я должен. С C ++ я всегда получаю ошибки тайм-аута. Данные в функциях, выполняющих вызов Read, идентичны в тесте C # и в программе C ++. Большая часть состояния в SslStream идентична. Сразу после вызова write и перед Read читаются только различия, несколько дескрипторов и то, что кажется адресатом памяти, но я предполагаю, что они не важны. В то же время я заметил, что в элементе с именем «base», затем внутри элемента с именем «InnerStream», а затем внутри «System.Net.Sockets.NetworkStream» есть свойство с именем «DataAvailable». Это верно в тесте C #, где он работает, и false в программе C ++, где он терпит неудачу. Я не знаю о какой-либо значимой разнице между этими проектами, кроме того, что я описал.
Я могу предоставить более подробную информацию об устранении неполадок или фрагментов кода. Я не включил код здесь, потому что только части, связанные с проблемой, все еще были бы огромны. Я надеюсь, что есть какой-то волшебный ответ относительно того, что происходит, однако ошибка почти наверняка глубока и очень конкретна. Я был бы признателен за все, что дает представление о дальнейших шагах по устранению неполадок.
Какие сложности возникают при вызове C #, хотя COM навязывает, что я, возможно, не учел?
Куда ушли сообщения других сторон, если не в буфер SslStream?
Где я должен искать?
Я нашел ответ, и он не связан с COM, C #, C ++ и вместо этого имеет отношение к форматированию сообщения, отправляемого между задействованными системами. Другая система использует дополнительный возврат каретки, чтобы указать конец сообщения. В случае отсутствия удаленная система просто перестает отвечать до тех пор, пока не будет запущен другой сеанс SSL.
На предыдущем этапе проекта я включал дополнительный разрыв строки в конце сообщений, отправляемых на сервер. Я скопировал одно из этих сообщений, чтобы произвести мой полностью тест на c #. Несколько раз я также брал сообщения, отправляемые из обеих кодовых баз, и помещал их в средство просмотра слияния / различий. Я никогда не замечал эту разницу, потому что я отключил сопоставление пробелов.
Теперь, когда я буду сравнивать необработанный вывод с другим необработанным выводом, я буду следить за тем, чтобы ни один из моих инструментов не скрывал от меня отличий.
Других решений пока нет …