Pour l'envoi de données dynamiques sur le réseau, vous disposez des options suivantes.
Première option dans le même paquet.
void SendData()
{
int size;
char payload[256];
Send(messageType)
Send(size);
Send(payload)
}
Deuxième possibilité:
void SendData()
{
char payload[256];
Send(messageType)
Send(payload)
}
Bien que dans les deux cas, vous serez confronté à plus d'un choix de conception. Dans le premier exemple, vous enverriez le type de message, la taille de la charge utile et aussi la charge utile.
La deuxième option que vous avez est que vous pouvez envoyer le type de message, puis vous pouvez envoyer la chaîne qui a un délimiteur de terminateur null.
Bien que l'une ou l'autre option ne couvre pas entièrement le problème de votre face je pense.Premièrement, vous devez déterminer si vous construisez un jeu quel type de protocole vous utiliserez, UDP? TCP? Le deuxième problème auquel vous serez confronté est la taille maximale des paquets. En plus de cela, vous devez avoir le cadre en place afin que vous puissiez calculer la taille optimale des paquets qui ne seront pas fragmentés et perdus pour l'inter web. Après cela, vous avez le contrôle de la bande passante en ce qui concerne la quantité de données que vous pouvez transmettre et recevoir entre le client et le serveur.
Par exemple, la façon dont la plupart des jeux abordent cette situation est que chaque paquet est identifié par ce qui suit. Dans le cas où vous devez envoyer des données dynamiques, vous enverriez une série de paquets et pas une seule. Par exemple si vous deviez envoyer un fichier à travers le réseau, la meilleure option serait d'utiliser TCP/IP parce que c'est un protocole de streaming et il efface que le flux complet arrive en toute sécurité à l'autre extrémité. D'autre part, UDP est un protocal basé sur les paquets et ne vérifie pas que tous les paquets sont arrivés dans l'ordre ou pas du tout à l'autre extrémité.
Donc en conclusion.
- Pour les données dynamiques, envoyer plusieurs paquets, mais avec un drapeau spécial dire plus de données est d'arriver à remplir ce message. Restez simple et si votre travail avec C++ ne suppose pas le paquet ou les données contiendra un terminateur null et vérifier la taille par rapport à la charge utile si vous décidez d'utiliser un terminateur null.
Cette question n'est pas très claire (Ou mon esprit ne fonctionne pas). La chaîne std :: est-elle copiée dans IN ou OUT? Quel est le problème avec le terminateur null comme une explication de la longueur? Pourquoi ne pas transmettre la longueur en premier? Qu'est-ce qui ne va pas avec memcpy'ing une structure? Pourquoi n'utilisez-vous pas une structure de paquets appropriée avec un identifiant qui vous indique le type du paquet afin que les deux parties sachent qu'elles envoient et reçoivent? – Goz
La chaîne std :: est en cours de copie et d'écriture. L'analyse des paquets à la réception des deux extrémités ne prend pas en charge la recherche du terminateur null. La longueur est transmise en premier, mais il y a un int et trois chaînes de longueur variable transmises. La longueur est le total pour chacun d'eux. Memcpying une structure pour une raison quelconque ne semble pas juste. Je me trompe probablement, mais c'est comme ça que ça se sent. Et nous avons une structure de paquets correcte, c'est la longueur variable qui m'apporte. – Robbie