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

протокол TCP, дополнительных свойств не утсанавливалось (через setsockopt()).
Спасибо.
Re: проблема у recv() та же что и у send()?
От: Alkash  
Дата: 27.11.03 11:41
Оценка:
Здравствуйте, EWhite, Вы писали:

А если еще раз вызвать на приемнике recv() пока все данные не дойдут.
Re: проблема у recv() та же что и у send()?
От: BOPOH_N Россия  
Дата: 27.11.03 11:59
Оценка:
По умолчанию на сокете используется так называемый алгоритм Nagle, который пытается накаплиать мелкие пакеты данных и отправлять их одним крупным блоком. Поэтому ты не можешь быть уверен что будешь считывать данные такими-же порциями как и отправлял.
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
Re: проблема у recv() та же что и у send()?
От: Vlost Россия  
Дата: 27.11.03 12:08
Оценка:
Здравствуйте, 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байт что-ли) эти данные отправляются в несколько пакетов. Если некоторые пакеты опаздали, то соединение пошлет запрос на повтор. И если ты в это время чиаешь то тебе отдадут тоько последние прочитанные данные, так что если читать точное число байт пиши свою функцию
Re[2]: проблема у recv() та же что и у send()?
От: Alvengo http://alvengo.chat.ru
Дата: 28.11.03 20:00
Оценка:
Здравствуйте, Vlost, Вы писали:
V>send() возвращает отличное от посылаемого число байт очень редко ( почти никогда ), т.к. она просто корирует данные из буфера, в какой-то буфер ОС

А как тогда понять отправлены (и получены!) ли они на самом деле? Буфер ОС это не есть получатель, до буфера дорога близкая... Я-то думал если send() вернул N, то все ОК...
Re[3]: проблема у recv() та же что и у send()?
От: EWhite  
Дата: 29.11.03 12:37
Оценка:
Вот! Согласный.

Пока пробую по-разному. Кста, через дополнительное считывание recv() не прокатило. Все равно не до конца.
Мож кто сталкивался с подобной проблемой тоже... как решалось?

Или кто знает, как отправить большой кусок данных?
Re[4]: проблема у recv() та же что и у send()?
От: VVV Россия  
Дата: 01.12.03 10:24
Оценка: 2 (1)
Здравствуйте, EWhite, Вы писали:

EW>Вот! Согласный.


EW>Пока пробую по-разному. Кста, через дополнительное считывание recv() не прокатило. Все равно не до конца.

EW>Мож кто сталкивался с подобной проблемой тоже... как решалось?

EW>Или кто знает, как отправить большой кусок данных?


Посмотри пример: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/security/using_sspi_with_a_windows_sockets_client.asp

функции: ReceiveMsg(ReceiveBytes) SendMsg(SendBytes)
Re[4]: проблема у recv() та же что и у send()?
От: DOOM Россия  
Дата: 03.12.03 08:43
Оценка:
Здравствуйте, EWhite, Вы писали:

EW>Вот! Согласный.


EW>Пока пробую по-разному. Кста, через дополнительное считывание recv() не прокатило. Все равно не до конца.

EW>Мож кто сталкивался с подобной проблемой тоже... как решалось?

EW>Или кто знает, как отправить большой кусок данных?


Берешь и создаешь собственный протокол, в заголовке которого указываешь сколько байт отправил в своей транзакции, а получатель считывает сначала фиксированную структуру заголовка, из которой понимает сколько еще надо ожидать информации...
Re[5]: проблема у recv() та же что и у send()?
От: Аноним  
Дата: 03.12.03 09:54
Оценка:
Здравствуйте, DOOM, Вы писали:

DOO>Берешь и создаешь собственный протокол, в заголовке которого указываешь сколько байт отправил в своей транзакции, а получатель считывает сначала фиксированную структуру заголовка, из которой понимает сколько еще надо ожидать информации...


Именно так.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.