Здравствуйте, EWhite, Вы писали:
EW> В форуме нашел, что send() может вернуть число отличное от количества посылаемого, таким образом его нужно вызвать еще раз. А это не вызовет дублирующихся данных на приемнике (recv())? EW> Проблема такая: send() отправляет несколько фрагментов данных, ну пусть по 15кБ ровно и завершающий пусть 7кБ. Функция возвращает точно отправленное количество данных. А вот на другой стороне recv() получает все полные фрагменты по 15 и далеко не полный последний (из 7 — всего 6кБ). То есть, часть данных получается просто не дошла. Правда ли не дошла? recv() возвращает другое число, чем отсылалось через send(). EW>Можно отправлять один(!) большой фрагмент (пусть 100кБ), но на recv() он опять будет не полный (70кБ). Это почему так?
EW>протокол TCP, дополнительных свойств не утсанавливалось (через setsockopt()). EW>Спасибо.
send() возвращает отличное от посылаемого число байт очень редко ( почти никогда ), т.к. она просто корирует данные из буфера, в какой-то буфер ОС
recv() не всегда читает ровно столько сколько послал send(). При посылке больше какой-то константы ( не помню точно — 1500байт что-ли) эти данные отправляются в несколько пакетов. Если некоторые пакеты опаздали, то соединение пошлет запрос на повтор. И если ты в это время чиаешь то тебе отдадут тоько последние прочитанные данные, так что если читать точное число байт пиши свою функцию