2017-04-25 7 views
2

Si recvmsg() d'un socket C contient une file d'attente, comment puis-je savoir combien d'éléments sont en attente dans la file d'attente?En C, pour un socket, recvmsg() a-t-il une file d'attente?

Mon problème est que la vitesse du code après avoir reçu quelque chose de recvmsg() est parfois plus lente que le taux de données envoyées à recvmsg(), ce qui entraînerait logiquement une file d'attente? Que se passe-t-il si la file d'attente devient trop grande?

Par exemple, si ceci est mon recv() Code:

while (recvmsg(SocketA,...) > 0) 
{ 
    ... 
    ...something that takes 1.5 seconds to execute/complete... 
    ... 
} 

et si la fonction suivante un autre endroit est appelé chaque 1 seconde:

// gets called every 1 second 
int send_to_sock() 
{ 
    ... 
    send(SocketA, ...); 
    ... 
} 

J'ai vérifié les pages de référence pour recvmsg () mais aucun d'entre eux ne mentionne quoi que ce soit au sujet d'une file d'attente, mais il semble qu'il y ait une file d'attente parce que j'observe des retards qui s'ajoutent progressivement. Mais le code cesse de fonctionner si la file d'attente devient trop longue, donc je veux savoir s'il existe un moyen de vérifier la longueur de la file d'attente.

+0

Pourquoi avez-vous une définition de fonction pour 'recv'? Normalement, 'recv' est défini par le système d'exploitation ... –

+0

Les sockets ont des tampons. Si c'est de cela que vous parlez, c'est probablement intéressant: http://stackoverflow.com/questions/7865069/how-to-find-the-socket-buffer-size-of-linux –

+0

répartis dans l'espace et le temps entre vous et le pair. Il est placé dans le serveur, le client et les routeurs intermédiaires. Il est en route le long des fibres sous-marines et dans l'espace libre entre les stations au sol et les satellites. Il y a des données là-bas, mais vous ne savez pas où c'est ou combien. – ThingyWotsit

Répondre

2

Ce n'est pas une file d'attente, c'est un tampon associé à la plupart des périphériques d'E/S, pas seulement des sockets. Par exemple, lorsque vous lisez depuis stdin avec quelque chose comme scanf, les données vont à votre programme lorsque vous appuyez sur Entrée. Où pensez-vous que toutes les frappes sont stockées entre-temps?

Les détails spécifiques de ces tampons sont définis par l'implémentation, mais ce qui se passe généralement avec les sockets est que les nouveaux paquets sont ignorés si le tampon est plein. Vous pouvez trouver plus d'informations sur l'interrogation de l'état du tampon dans How to find the socket buffer size of linux et How can I tell if a socket buffer is full?.

2

Oui. Il y a un tampon de réception de socket. Sa taille maximale peut être obtenue et définie via getsockopt() et setsockopt() en utilisant l'option SO_RCVBUF. Quand il se remplit, dans le cas de TCP l'expéditeur reçoit l'ordre d'arrêter d'envoyer; dans le cas d'UDP, d'autres données entrantes sont rejetées.