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;
}