2015-09-04 6 views
2

Надеюсь, вы простите меня, если это будет очевидно; просто начиная с C++/cli. Я использую образец кода C# для его создания, но я использую режим cli в унаследованном приложении C++, поэтому у меня возникают проблемы с переводом. Нелегко найти образцы в Интернете.C++/CLI с использованием XmlWriter с TcpClient, не записывающим

Это фрагмент кода. XDocument передается в этот код. Я проверил его, записав файл, и полученный XML-файл выглядит так, как должен (идентичный образцу C# app). Похоже, что вызов tcpclient работает, если я меняю адрес, он выдает исключение. Я также вижу соединение, установленное в TCP Sniffer.

Запрос-> WriteTo не работает - снифер показывает, что данные не записаны, и устройство не отвечает.

Далее, XmlReader :: Create call блокирует все.

Очевидно, что у меня что-то не так, как я настраиваю автора или поток.

Любые идеи?

Спасибо.

  TcpClient^socket = gcnew TcpClient(address,port); // connect to device 

      NetworkStream^stream; 
      stream = socket->GetStream(); // get stream. 

      XmlWriter ^writer = XmlWriter::Create(stream,xmlWrite); // Create writer 

      request->WriteTo(writer); // Write XDocument to stream. 

      XmlReader ^reader = XmlReader::Create(stream,xmlRead); 
+0

TcpClient подключается по вызову выше. Как я уже говорил, программа sniffer TCP показывает, что она подключена. Но я попытался изменить код, потому что думал, что, возможно, вы что-то сделали, и создал сокет без параметров адреса, порта и последовал за ним с помощью команды socket-> Connect (address, port). Такое же поведение. Это устройство, с которым я подключаюсь, имеет очень специфическое поведение, и я уверен, что он закроет поток. Я не получаю никакого ответа на устройство, и, по сути, сниффер TCP не показывает данные, отправленные из WriteTo. – KokoCa

ответ

0

Я не знаю, если это хорошая форма или нет, но я нашел ответ, поэтому я выложу здесь, в случае, если кто-то имеет подобную проблему:

После request-> WriteTo (писатель) Я добавил writer-> Flush().

Странно, что пример C#, над которым я работал, не требовал этого, поэтому, если кто-нибудь знает, в чем разница, я бы хотел его услышать.

+0

Это не странно ;-) 'XmlWriter' будет буферизовать данные для записи. Вызов 'Flush' говорит ему отправить свой буфер в поток. Уверен, что код C# завернул его в блок 'using' (' Dispose' вызывает 'Flush'), который может быть переведен в семантику стека в C++/CLI. –

Смежные вопросы