Limite maximale de la taille des données dans IPC utilisant des sockets sous Unix

J’utilise AF_UNIX, socket SOCK_STREAM pour IPC entre 2 processus différents. Le client envoie des données sur le socket que le serveur capte et traite. La taille de chaque bloc de données que le client écrit sur le socket est d’environ 13 kilo-octets à l’aide de la commande suivante:

Send Command in client : send(s, txPackDisp, sizeof(float)*PACKET_LENGTH, 0); 

Toutefois, lorsque je reçois les données sur le serveur à l’aide de la commande suivante:

 Receive command in server : recv(s, bfoData, PACKET_LENGTH*sizeof(float),0); 

les données reçues à chaque fois ne sont que partielles de ce que j’envoie (il y a beaucoup de zéros à la fin, ce qui ne devrait pas être le cas).

Donc mes questions sont:

  1. Y a-t-il une limite à la taille maximale des données que je peux envoyer via AF_UNIX, SOCK_STREAM (d’après ce que j’ai lu, je ne pense pas qu’il y en a)

  2. Le socket divise-t-il les données en blocs plus petits lors du transfert et si c’est le cas, je dois recevoir les blocs plus petits individuellement ou en bloc unique, comme je le fais actuellement.

  3. Sera-t-il préférable d’utiliser AF_UNIX, socket SOCK_DGRAM ici.

PS: Le code source des fonctions principales du serveur et du client peut être vu dans cette question: IPC utilisant des sockets de domaine Unix

Q1) Is there a limit on the maximum limit on the size of data that I can send over the AF_UNIX,SOCK_STREAM socket ( from what I have read , I don't think there is )

Vous avez raison. Il n’y a pas de limite réelle pour SOCK_STREAM.

Q2 a) Does the socket break up the data into smaller blocks when transferring

Vous avez raison. Le stream est divisé en paquets de taille gérable, négociés à la fois par l’émetteur et le récepteur.

Q2 b) and if thats the case do I need to receive the smaller blocks individually or as single block like I am doing right now.

Vous n’avez rien à faire. Le stream est réassemblé à l’autre bout, tel qu’il a été transmis.

Q3) Will it be better to use AF_UNIX,SOCK_DGRAM socket here.

Non. Sauf si vous avez besoin d’apprendre tout sur la négociation de la taille des paquets, la vérification des paquets manquants et leur renvoi, en vous assurant que les paquets reçus en désordre sont gérés correctement, etc.

Pour les sockets SOCK_STREAM, les limites de message ne sont pas conservées. Le système peut segmenter le message en plusieurs messages à l’extrémité distante.

Les sockets SOCK_DGRAM, par contre, envoient toujours le message entier ou aucun.

Voir: Spécification POSIX pour socket :

SOCK_STREAM Fournit des stream d’octets en mode connexion séquentiels, fiables, bidirectionnels, et peut fournir un mécanisme de transmission pour les données hors bande. SOCK_DGRAM Fournit des datagrammes, qui sont en mode sans connexion, des messages non fiables de longueur maximale fixe.

et envoyer :

Si le message est trop long pour passer par le protocole sous-jacent, send () échouera et aucune donnée ne sera transmise.

Dans le cas de AF_UNIX, le principal facteur déterminant qui décidera si un message peut être envoyé est la disponibilité de tampons contigus suffisamment importants pour accueillir vos données. Étant donné que vous envoyez 13 Ko, cela ne devrait pas poser problème.

Si vous vous en tenez à SOCK_STREAM, votre code de réception doit être préparé pour le fait qu’un seul appel à recv peut ne pas récupérer un message entier envoyé par l’expéditeur. recv retournera le nombre d’octets réellement reçus, ou -1 s’il y a une erreur. Si les messages ont une longueur fixe, vous pouvez l’appeler plusieurs fois jusqu’à ce que vous ayez le message entier.

Si vous passez à SOCK_DGRAM, vous pouvez être assuré que le message entier sera envoyé en un seul coup, mais il y aura une limite à la taille des messages que vous pouvez envoyer. 13KB devrait être bien si.

En général, SOCK_DGRAM n’est pas garanti pour être fiable ou pour que les messages soient livrés en séquence. Cependant, dans la plupart des implémentations UNIX, les datagrammes AF_UNIX sont fiables et ne seront pas réorganisés (voir: man unix . Consultez la page de manuel pour savoir si cela s’applique).