Fragmentation TCP

Je sais que TCP fournit une transmission de données de type stream, mais la question principale est de savoir quelles situations peuvent se produire lors de l’envoi de données via TCP.
1. Le message peut être scindé en N morceaux pour correspondre à la taille du MTU.
2. Deux messages peuvent être lus en un seul appel.

Peut-il y avoir la prochaine situation?
MTU par exemple 1500 octets.
Les appels clients envoient avec des données de 1498 octets.
Les appels clients sont envoyés avec des données de 100 octets.
Le serveur appelle recv et reçoit des données de 1500 octets.
Le serveur appelle recv et reçoit des données sur 98 octets.

Il en résulte une situation où 2 octets du deuxième envoi client seront reçus dans le premier serveur recv.

Mon protocole défini comme suit:
4 octets – longueur de données
contenu des données.

Je me demande si je peux imaginer une situation où 4 octets (longueur de données) seront divisés en 2 morceaux.

Oui, un stream d’octets peut être fractionné sur n’importe quelle limite d’octet. Vous pouvez certainement diviser votre en-tête de longueur de données de 4 octets de 8 manières différentes:

4 1-3 2-2 3-1 1-1-2 1-2-1 2-1-1 1-1-1-1 

Certains d’entre eux sont plus susceptibles de se produire que d’autres, mais vous devez en tenir compte. Le code qui pourrait gérer ceci pourrait ressembler à ceci:

 unsigned char buf[4]; size_t len = 0; while (len < sizeof(buf)) { ssize_t n = recv(s, buf+len, sizeof(buf)-len, 0); if (n < 0) { // error handling here } len += n; } length = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24); 

J’écris toujours mes applications de manière à ce que les données soient fragmentées d’une manière ou d’une autre . Ce n’est pas difficile à faire une fois que vous avez un bon design.

Quelle est la meilleure façon de surveiller un socket pour les nouvelles données et ensuite de traiter ces données?