У меня есть код, в котором есть, есть TCP-соединение между клиентом и сервером. Мне нужно отправить некоторые XML-данные на сервер и получить от него ответ. Я пытаюсь сделать это вот так:
char request[MAX];
sprintf(request, "<attestationRequest><majorVersion>%d</majorVersion><minorVersion>%d</minorVersion></attestationRequest>", major, minor);
write(sockfd,request, length);
while(recv(sockfd, response, MAX, 0) >= 0)
{
cout << "response " << response;
//do something;
}
Но полученные данные (ожидаемый ответ + запрос).
Если я попытаюсь заполнить данные с помощью QString
, полученные данные являются правильными.
QString request = QString("<attestationRequest>"
"<majorVersion>%1</majorVersion>"
"<minorVersion>%2</minorVersion>"
"</attestationRequest>")
.arg(major)
.arg(minor)
Остальная часть кода одинакова для обоих случаев. Я получаю более 11000 байт данных, когда я использую sprintf
, но 9000 байт в случае QString
. Я не могу понять, не хватает ли чего-то.
ИМО оба решения плохие.
Безопаснее и лучше использовать QXmlStreamWriter. Ручное манипулирование текстом в большинстве случаев заканчивается неправильной кодировкой или отсутствующей управляющей последовательностью или другим нарушением формата XML.
Другая проблема заключается в том, что вы не дали никаких данных о том, как вы выполняете общение. Очень вероятно, что возникла ошибка, вызвавшая вашу проблему.
connect()
для обоих случаев. Нет ошибки в соединении как таковом. Я пытаюсь избежать зависимости от Qt
. Итак, я попытался использовать sprintf
.
Скорее всего, ваша проблема заключается в том, что данные UTF-16 отправляются через соединение (это QString.)
Возможно, если вы попробуете w_char-версии этих команд, это может преуспеть.
snprintf
поверхsprint
. Таким образом вы убедитесь, что не переполняете буфер. Также сохраните возвращаемое значение, чтобы узнать длину строки для отправки и посмотреть,snprintf
ли ееsnprintf
.sprintf
здесь, потому что я знал размер запроса и даже выделил больше, чем нужно.