0

我一直在为我的数据网络课程工作,他们要求我连接这样的标题:

struct ip
{
    unsigned long a;
    unsigned long b;
    unsigned int l;
} IP;

还有一条消息,它是一个 char*,让我们说“你好”。

因此,我使用这种方法将这两个连接到一个 char* 中:

memcpy(sendBuf, (void*)&sendHeader, sizeof(sendHeader));
memcpy(&sendBuf[sizeof(sendHeader)], readMessage, lengthMessage);

lengthMessage 是消息 +1 的字符数,它是空终止字符。

所以, sendBuf 是这样定义的:

char sendBuf[BUFLEN + 1]   // BUF_LEN = 128

然后我把这个 char* 放在一个这样定义的队列中:

concurrency::concurrent_queue<char*> IP_in_queue;

所以,我想检查信息是否正确,所以我只检查所有内容:

char* s;
IP_in_queue.try_pop(s);
numbytes = sizeof(s);
// Copy from buf to the header
memcpy( (void*)&readHeader, s, sizeof( IP_PACKET_HEADER_T));
// Copy message part
memcpy( sendedString, &s[sizeof(IP_PACKET_HEADER_T)], numbytes - sizeof(IP_PACKET_HEADER_T));
// Append \0 to the end
sendedString[numbytes - sizeof(IP_PACKET_HEADER_T)] = '\0';

所以,在我排队我的 char* 之前,我们知道 sendBuf 的大小是 129,但是当我检查出队后的字节数时,它的差异太大了,字节数的值是 4,但即使这样我得到正确的信息,所以我不明白,也许我错过了一些重要的事情,但变量 numbytes 至少不应该更多?

我希望我说清楚了,也许有人可以更好地向我解释一下。

谢谢

4

1 回答 1

1

sizeof不会告诉你字符串的长度——它会告诉你类型的大小,char*在 32 位机器上是 4 个字节。你想要strlen,字符串中的字节数。

但即使这样也不是你想要的。您的结构IP中可能包含空值,因此甚至strlen不会给您正确的答案。如果你把你的字符串放在第一位而不是最后一个,你可以解决这个问题,但我会考虑这种黑客行为。您应该将大小显式添加到消息的开头。

于 2012-09-19T03:09:30.120 回答