Je construis une application simple à l'aide de C qui utilisait Le code est comme suit: p> recvmmsg () code>, et le cinquième paramètre passé est le délai d'expiration de type struct TimesPec code>. Je définit le temps d'attente à 5 secondes, mais cela ne fonctionne pas, il fait obstacle à l'infini.
3 Réponses :
Voir ici: http://permalink.gmane.org/gmane.linux.man / 3440 p>
Fondamentalement, le paramètre Timeout Spécifie une durée maximale pour attendre plus de messages, mais l'opération de réception sous-jacente est toujours bloquée. Donc, si vous définissez un délai d'attente de 5 secondes et recevez un message chaque seconde, il s'arrêtera après avoir reçu 5 messages, même s'il y a de l'espace dans les tampons pour plus. Ce qu'il ne fera pas, c'est le retour après 5 secondes s'il n'y a pas de données du tout. Pour cela, vous devez utiliser l'un des mécanismes habituels, comme Select () ou Epoll () avec un délai d'attente ou une attente occupée, etc. p>
Je ne peux pas vraiment imaginer un cas d'utilisation où cela est utile et destiné.
Dans le lien de cette réponse, j'ai trouvé une citation très illustrative "RECVMMSG () a un paramètre de délai d'attente explicite, mais il ne semble pas que cela fonctionne correctement et la documentation ne mentionne pas comment elle est censée interagir avec SO_RCVTimeo." Ceci a été utile car cela explique pourquoi vous devez définir le paramètre SO_RCVTimeo code> de la prise si vous souhaitez que le paramètre RECVMMSG () CODE> Timeout ne bloque pas indéfiniment. (Mon code de test RECVMMSG (à partir de homme recvmmsg (code>) bloque indéfiniment avec un délai d'attente de 1 seconde. Si vous définissez le SO_RCVTimeo de la prise, il ne bloque pas indéfiniment.)
Comme alternative, vous pouvez utiliser setSockopt code> avec option SO_RCVTimeo CODE> pour définir un délai d'attente sur la prise. Cela affectera toutes les opérations de lecture effectuées dessus. P>
Il y a un bogue dans la mise en œuvre de RECVMMSG: P>
AVIS, Je vous suggère d'utiliser PSelect code> vous permet de vérifier si les données sont disponibles. Cependant, il ne garantit pas recvmmsg code> n'attendra pas pour toujours. Par conséquent, n'utilisez pas cette méthode. P>
SO_RCVTimeo code> dans Ajouter des Timeout CODE> Paramètre de RECVMMSG. RECVMMSG quittera si aucune donnée n'a été reçue depuis SO_RCVTimeo code> ou après Timeout code>. Dans le pire des cas, RECVMMSG quittera après Timeout code> + SO_RCVTimeo CODE> (cas où les données sont reçues juste avant la fin de Timeout code> et aucune donnée n'en arrivent plus). . P>
Il y a une suggestion d'un éventuel bogue ici qui pourrait être pertinent: list.openwall.net / NetDev / 2012/12/23/30
@Vicky: C'est à peu près à droite - semblable au lien de ma réponse. Cependant, il n'est pas clair que quiconque va changer le comportement - plus probablement, il sera considéré comme un bogue de documentation, la page Man sera mise à jour et le paramètre timeout presque inutile ne sera tout simplement pas utilisé par la plupart des applications.
Il existe une autre solution dans la liaison ci-dessus à l'aide de SELECT: Stackoverflow.com/Questtions/12713438/...