Да, может случиться несколько вещей.Прежде всего, имейте в виду, write
возвращается очень быстро , поэтому не думайте, что выполняется много ошибок (все мои данные подтверждены?).
Дверь № 1
Вы write
и flush
ваши данные.TCP
старается изо всех сил доставить его.Что означает, что он может выполнять ретрансляции и тому подобное.Конечно, ваш send
не застревает в течение такого длительного периода времени (в некоторых случаях TCP
пытается в течение 5-10 минут, прежде чем обстреливает соединения).Таким образом, вы никогда не узнаете, действительно ли другая сторона получила ваше сообщение.При следующей операции в сокете вы получите сообщение об ошибке.
Дверь № 2
Вы write
и flush
ваши данные.Из-за непостоянства MTU и из-за того, что строка длинная, она отправляется в нескольких пакетах.Итак, ваш ровесник reads
некоторые из них и представляет их пользователю, прежде чем получить все это.
Итак, представьте, что вы отправляете: "Привет тьма, мой старый друг, я пришел поговорить с вами снова«.Другая сторона может получить «Привет тьма м» .Однако, если он выполнит последующие read
с, он получит все данные.Таким образом, удаленная сторона TCP фактически получила все, она ACKed все, но пользовательскому приложению не удалось read
данные, чтобы вывести его из рук TCPs.