Question

Je suis un peu confus sur le comportement des QTcpSocket::waitForBytesWritten() . ..

Jusqu'à quand est-ce bloc de fonction?

  • Tant que les données sont écrites dans la mémoire tampon interne du système d'exploitation pour la transmission via TCP?
  • Tant que les données sont converties physiquement aux paquets TCP et envoyés?
  • Jusqu'à ce que l'ensemble des données sont transmises et le client distant reconnaît que tous les paquets ont été reçus?

Je regarde la documentation, mais il ne semble pas être très clair.

Était-ce utile?

La solution

D'une manière générale que les systèmes d'exploitation fournissent des API faciles pour la première question - puisque Qt est une API portable, il est préférable que de compter sur elle faisant référence au transfert à la mémoire tampon de l'OS. Si vous avez besoin d'un accusé de réception réelle de réception, il est préférable de l'avoir envoyé par l'application à distance -. Après tout, les données peuvent être ack'd par la télécommande, mais jamais lues OS tampon de lecture de la télécommande

Si vous devez éviter que le bloc latéral à distance vous pour toujours, vous devriez plutôt attendre que le QIODevice::bytesWritten signal et retour à la boucle d'événement pour faire d'autres travaux, ou tout simplement un délai fixé approprié. En général, le côté éloigné peut toujours vous bloquer à un certain niveau - par exemple, il peut refuser de ack, remplir votre tampon de système d'exploitation local, à quel point les écritures ne le fera pas de Qt à l'OS; Peu importe quel niveau waitForBytesWritten() est à, il peut toujours être bloqué.

En tant que tel, bytesWritten et waitForBytesWritten() ne devrait être utilisé pour l'accélérateur de la source des données - à savoir, si vous deviez aller dans une boucle serrée en passant 1G de données à la prise à la fois, vous pourriez finir par mise en mémoire tampon dans le processus en cours d'exécution et à la sortie de la mémoire. En déclenchant lit supplémentaire / écrit avec le signal bytesWritten, vous pouvez éviter ce problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top