7
votes

Comment définir le délai d'attente dans RECVMMSG ()?

Je construis une application simple à l'aide de C qui utilisait recvmmsg () , et le cinquième paramètre passé est le délai d'expiration de type struct TimesPec . Je définit le temps d'attente à 5 secondes, mais cela ne fonctionne pas, il fait obstacle à l'infini.

Le code est comme suit: xxx

c

3 commentaires

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/...


3 Réponses :


5
votes

Voir ici: http://permalink.gmane.org/gmane.linux.man / 3440

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.


2 commentaires

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 de la prise si vous souhaitez que le paramètre RECVMMSG () Timeout ne bloque pas indéfiniment. (Mon code de test RECVMMSG (à partir de homme recvmmsg ) 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.)



6
votes

Comme alternative, vous pouvez utiliser setSockopt avec option SO_RCVTimeo pour définir un délai d'attente sur la prise. Cela affectera toutes les opérations de lecture effectuées dessus.


0 commentaires