2010-08-24 4 views
2

У меня есть широкоформатное XML-сообщение, которое мне нужно отправить через сокет Win32 на C++.Отправка буфера TCHAR с помощью send (sock, wszBuffer, ...)?

TCHAR wszBuffer[1024]; 

Должен ли я sprintf(szSendBuffer, "%S", wszBuffer) широкий буфер символов в char массива перед отправкой?

Каков правильный способ отправить это сообщение?

+0

У C++ есть розетки? – dreamlax

+0

@dreamlax: Сокеты Win32 на C++. Исправлен вопрос. –

ответ

2

Пропустить wszBuffer непосредственно в функцию сокета, отбрасывая его на char *, с длиной = sizeof (wszBuffer) или 1024 * sizeof (TCHAR). В этом случае буфер будет отправляться как есть.

Если вы хотите отправить этот текст в виде строки ANSI, преобразуйте его с помощью любой функции преобразования строк. sprintf в порядке, другой способ - W2A. Но некоторая информация может быть потеряна.

+0

Я не управляю принимающей стороной, которая является Java TCP-сервером. Если я просто произведу его, не повлияет ли это на символы, прочитанные их потоком, и проанализируется как XML? –

+1

Если приемник ожидает строку ANSI, вам необходимо преобразовать ее в ANSI. Если получатель ожидает строку Unicode, просто отправьте ее как поток байтов. Конечно, это должно быть одинаково на обоих концах. –

0

Вы можете просто передать его символу char *. На другом конце вы можете просто передать полученный буфер в wchar_t *.

+0

'sizeof' всегда в байтах, а не в количестве элементов, поэтому выражение, которое вы показываете, неверно. –

+0

Вы правы - изменили мой ответ –

1

Поскольку вы имеете дело с XML, вам необходимо закодировать его в кодировке UTF-8 или другой XML-кодировке (и указать эту кодировку в прологе XML), прежде чем отправлять ее по сокету.

1

Используйте WideCharToMultiByte, чтобы преобразовать его в кодировку UTF-8 (или любой другой char), если вы объявите ее в XML-файле).