【发布时间】:2014-11-14 11:57:31
【问题描述】:
我有一些代码,在客户端和服务器之间有一个 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)
这两种情况的其余代码相同。当我使用sprintf 时,我收到了超过 11000 字节的数据,但在使用QString 时收到了 9000 字节。如果我遗漏了什么,我无法理解。
【问题讨论】:
-
在
sprint上使用snprintf。这样你就可以确保你不会溢出缓冲区。还存储返回值以了解要发送的字符串的长度,并查看snprintf是否截断它。 -
我在这里使用了
sprintf,因为我知道请求的大小,我什至分配的比它需要的多。 -
@Shwrtha 您仍应始终使用
snprintf。无论如何,您在这里的代码不足以确定问题。MAX、major和minor是什么?为什么要使用MAX来给出请求长度? -
MAX 为 1000,major = 1,minor = 1
-
这是一个苹果与橘子的比较。 QString 在所有平台上都是 UTF-16,char* 可以表示任何 8 字节编码。无论哪种方式,都很难从示例代码中知道要做什么,因为它缺少一个相当重要的结束引号。