TL;DR:
我正在实现一个客户端-服务器系统,客户端通过设置大小为char [256]的字符缓冲区请求数据。
服务器以两个阶段的响应方式进行回复。首先,使用大小为char [20]的头部缓冲区发送“头数据包”,其中包含随后要发送的数据包数量和最大包大小(以分配“数据”缓冲区)。
假设从服务器发送的文本如下所示:
QString text = QString("TOKEN=1SOMETOKENSTRING123;");
//length of text = 26 char
使用以下方法将“标题包”成功接收、解析并转换为QString,无任何缺陷:
//header
char header_buffer[20];
bzero(header_buffer, sizeof (header_buffer));
//assign header_buffer using socket.recv()
QString header = QString(header_buffer);
这项工作已经成功完成。
问题信息:
头部已解析,输出属性大小(最大数据包大小)和计数(随后的“数据”包数)。
问题所在区域:
//data packet section
//returns the size of largest packet using the received "header packet" - done successfully
int maxSize = getMaxPacketSize(header_buffer);
//maxSize = 27 char, which is the length of the 'text' String sent from the server, thus
char data_buffer[maxSize]; //char[27]
bzero(data_buffer, sizeof (data_buffer));
//assign data_buffer using socket.recv()
QString data = QString(data_buffer);
qDebug() << data_buffer; CORRECT //displays "TOKEN=1SOMETOKENSTRING123;"
qDebug() << data; ERROR //displays "TOKEN=1SOMETOKENSTRING123;UUU"
具体问题:
从char[]创建新的QString会在字符串末尾添加3个'U'字符:
基本示例:
char cArray[27] //assume it has contents to fill all, size/count = 27
QString str = QString(cArray);
int len = str.length();
//len = 30, last 3 char of str = "UUU"
数据示例(实际数据):
int packetSize = getMaxPacketSize(buffer); buffer[20] = "COUNT=2;SIZE=27;\000\000\000\000"
char packet[packetSize]; // = 27
size_t size = sizeof (packet); // = 27
bzero(packet, sizeof (packet));
if (recv(sockfd,packet,sizeof (packet),0) < 0) {
qDebug() << "ERROR netman: reading data from socket";
//more code here
}
//Add packet to packet_data list
//NOTE : QList<QString> packet_data = QList<QString>();
//NOTE: packet[27] = "TOKEN=a7nCrDbaycWx2JzMir4m;"
packet_data.insert(packetSize-packetNum,QString(packet));
QString d = packet_data.first(); d = "TOKEN=a7nCrDbaycWx2JzMir4m;UUU"
为了更详细地描述问题,以下是调试器数据
Locals
d "TOKEN=a7nCrDbaycWx2JzMir4m;UUU" QString
[0] 'T' 84 0x0054 QChar
[1] 'O' 79 0x004f QChar
[2] 'K' 75 0x004b QChar
[3] 'E' 69 0x0045 QChar
[4] 'N' 78 0x004e QChar
[5] '=' 61 0x003d QChar
[6] 'a' 97 0x0061 QChar
[7] '7' 55 0x0037 QChar
[8] 'n' 110 0x006e QChar
[9] 'C' 67 0x0043 QChar
[10] 'r' 114 0x0072 QChar
[11] 'D' 68 0x0044 QChar
[12] 'b' 98 0x0062 QChar
[13] 'a' 97 0x0061 QChar
[14] 'y' 121 0x0079 QChar
[15] 'c' 99 0x0063 QChar
[16] 'W' 87 0x0057 QChar
[17] 'x' 120 0x0078 QChar
[18] '2' 50 0x0032 QChar
[19] 'J' 74 0x004a QChar
[20] 'z' 122 0x007a QChar
[21] 'M' 77 0x004d QChar
[22] 'i' 105 0x0069 QChar
[23] 'r' 114 0x0072 QChar
[24] '4' 52 0x0034 QChar
[25] 'm' 109 0x006d QChar
[26] ';' 59 0x003b QChar
[27] 'U' 85 0x0055 QChar
[28] 'U' 85 0x0055 QChar
[29] 'U' 85 0x0055 QChar
message "AUTH;U=user@example;P=Pass;" char *
packet "TOKEN=a7nCrDbaycWx2JzMir4m;" char [27]
packetNum 1 int
packetSize 27 int
s "COUNT=2;SIZE=27;" QString
size 27 size_t
this @0x7fffffffd190 netman
buffer "COUNT=2;SIZE=27;\000\000\000\000" char [20]
cli_addr @0x7fffffffd1c0 sockaddr_in
clilen 1431695692 socklen_t
n 1436538608 int
newsockfd 32767 int
packet_data <1 items> QList<QString>
serv_addr @0x7fffffffd1b0 sockaddr_in
server @0x7ffff5f071c0 hostent
sockfd 13 int
我不知道这3个额外字符来自何方!
有任何建议/想法的人吗?