我正在通过 TCP/IP 发送消息,我需要在 char 数组中添加消息长度前缀,然后发送它。我该怎么做?
您还可以提供一个如何在另一端提取它的示例。如果可能,请解释一下。
我正在使用 C++ 和 Winsock。
编辑:
string writeBuffer = "Hello";
unsigned __int32 length = htonl(writeBuffer.length());
它没有返回正确的长度,而是一个非常大的数字。
对于接收部分,如果我使用 ntohl(),那么我也会得到一个大数字而不是正确的长度?为什么呢?我收到这样的
bool Server::Receive(unsigned int socketIndex)
{
// Read data from the socket
if (receivingLength)
{
bytesReceived = recv(socketArray[socketIndex - WSA_WAIT_EVENT_0],
((char*)&messageLength) + bytesReceived, MESSAGE_LENGTH_SIZE - bytesReceived, 0);
if (bytesReceived == SOCKET_ERROR)
{
return false;
}
if (bytesReceived == MESSAGE_LENGTH_SIZE)
{
// If uncomment the following line,
// I won't get the correct length, but a large number
//messageLength = ntohl(messageLength);
receivingLength = false;
bytesReceived = 0;
bytesLeft = messageLength;
}
}
else
{
if (bytesLeft > BUFFER_SIZE)
{
return false;
}
bytesReceived = recv(socketArray[socketIndex - WSA_WAIT_EVENT_0],
&receiveBuffer[bytesReceived], bytesLeft, 0);
if (bytesReceived == SOCKET_ERROR)
{
return false;
}
if (bytesReceived == messageLength)
{
// we have received full message
messageReceived = true;
receiveBuffer[bytesReceived] = '\0';
// wait for next message
receivingLength = true;
}
bytesLeft -= bytesReceived;
}
return true;
}