Все то, что функция send() посылает на хост, может разделиться на несколько отдельных порций данных, на прочтение каждой из которых нужен отдельный вызов recv(). Т.е. если я делаю так:
send("GET file.txt");
,то сообщение может разделиться на отдельные части, например:
"GE", "T fi", "le.txt"
,причем для прочтения каждой части нужен отдельный вызов recv().
С этим можно бороться, предварительно посылая пару байтов, в которых записан размер передаваемого сообщения. Тогда его можно будет легко прочитать по кусочкам в цикле.
НО: если принимаемое сообщение дробится, значит ли это, что при выполнении
send("GET file.txt");
выполнится
send("GET fi");
,при этом остальная часть сообщения отбросится для дальнейшей передачи? Иначе говоря, обязательна ли проверка числа отправленных байтов на передающем хосте и циклический вызов send() для полной отправки сообщения? Или все же можно обойтись всего одним вызовом send() и несколькими вызовами recv()? И будут ли какие-то изменения в этом поведении, если я использую асинхронные сокеты?
Сборка персонального компьютера от Artline: умный выбор для современных пользователей