J'envoie des messages sur TCP/IP, j'ai besoin de préfixer la longueur du message dans un tableau char puis de l'envoyer. Comment fait-on ça?Comment préfixer la longueur du message dans TCP/IP
Pouvez-vous s'il vous plaît fournir un exemple de comment l'extraire à l'autre extrémité. Et si possible, s'il vous plaît expliquer. J'utilise C++ et Winsock.
EDIT:
string writeBuffer = "Hello";
unsigned __int32 length = htonl(writeBuffer.length());
Il ne revient pas à la bonne longueur plutôt un très grand nombre.
Pour la partie réceptrice, si j'utilise ntohl(), alors j'obtiens aussi un grand nombre au lieu de la bonne longueur? Pourquoi est-ce si? Je reçois comme ce
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;
}
Votre machine utilise l'ordre des octets opposé à celui du réseau, de sorte que le nombre semble insuffisant après la conversion. N'essayez pas d'interpréter le résultat de htonl(), envoyez-le simplement. – sharptooth
La même chose s'applique à ntohl - vous ne l'appliquez qu'à un nombre dans l'ordre des octets du réseau et n'interprétez que la valeur de retour. – sharptooth
Pouvez-vous me dire comment le convertir à l'ordre des octets de ma machine dans .NET? (qui est l'application client) – akif