![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
про send
zxc © (2004-01-21 17:01:00)процедура send не всегда отправляет сразу весь размер данных который ей указан, как можно это обойти??
Digitman (2004-01-23 16:25:00) [1]
> Admin_voyag (22.01.04 17:25) [36]
> Третий - len, задает число отправляемых из буфера символов
это - размер ранных. затребованных прикл.задачей к буферизации системным передающим транспортом ... не более того
Verg (2004-01-22 17:38:00) [2]
> Admin_voyag (22.01.04 17:28) [37]
> Размер буфера тут не причем, сокет всегда передаст столько
> сколько указано в третьем параметре функции send. Просто
> при меньщем коллмчестве произойдет небольшая задержка, а
> потом инициация передачи. Все уже на практике отработано.
Ты вообще о чем?
Return Values
If no error occurs, send returns the total number of bytes sent, which can be less than the number indicated by lenfor nonblockingsockets.Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
Ты хоть это читал?
Это MSDN.
Fredericco (2004-01-22 17:36:00) [3]2 Admin_voyag (22.01.04 17:28) [37]
Delphi help
For non-blocking sockets, the data is sent to the WinSock DLL which has it's own internal buffers. If the WinSock can accept additional data, SendBuf returns immediately with the number of bytes queued. If the WinSock internal buffer space is not able to accept the buffer being sent, SendBuf returns -1 and no data is queued at all
Admin_voyag (2004-01-22 17:28:00) [4]Размер буфера тут не причем, сокет всегда передаст столько сколько указано в третьем параметре функции send. Просто при меньщем коллмчестве произойдет небольшая задержка, а потом инициация передачи. Все уже на практике отработано.
Admin_voyag (2004-01-22 17:25:00) [5]Из того же самого руководства стр. 168 "Функция send и WSASend.
API-функция send для отправки данных по сокету определена так:
int send(
SOCKET s,
const char FAR * buf,
int len,
int flags
);
Параметр s определяет сокет для отправки данных. Второй параметр - buf указывает на символьный буфер, содержащий данные для отправки. Третий - len, задает число отправляемых из буфера символов. И последний параметр - flags, может принимать значение 0, MSG_DONTROUTE, MSG_OOB, или результат логического ИЛИ над любыми из этих параметров." (Описание параметров flags) "... При успешном выполнении функция send вернет количество переданных байт, иначе ошибку SOCKET_ERROR."
и т.д.
Тут кто-то хотел съесть свою шляпу. Так что вперед.
Digitman (2004-01-22 16:53:00) [6]
> Admin_voyag (22.01.04 16:45) [34]
из вопроса авторя неочевидно, СКОЛЬКО данных он хочет отправить СРАЗУ ... то ли меньше размера транспортного буфера, то ли больше ... отсюда и недоразумение ... а по поводу nagle-алгоритма - это само собой разумеется
Admin_voyag (2004-01-22 16:45:00) [7]Автор вопроса спрашивает, как обойти алгоритм задержки при передачи данных, который называется Neagle (если Вам таковой известен) и заставить сокет отправлять те данные, которые в него помещаются. Но это при условии, что передается данных меньше чем размер буфера. Time Outтом здесь называется время ожидания в течении которого должны быть поступлены данные для полного заполнения буфера.
Выдержка из официального руководства Microsoft "Программирование в сетях Windows" (русский перевод) стр. 268, "Чтобы увеличить эффективность и пропускную способность за счет уменьшения издержек, система выполняет алгоритм Neagle, который позволяет "укрупнить" пакеты TCP. Издержки в том, что длина заголовка TCP для каждого пакета - 20 байт. Расточительно отправлять сообщение по 2 байта с 20-ти байтным заголовком, поэтому когда приложение запрашивает порцию данных, система сможет накапливать данные в течение некоторого времени перед фактической отправкой по сети. Если дополнительные данные за указанный период времени не накопятся, оправка произойдет безусловно.
Недостаток этого алгоритма - замедление подтверждений о получении данных TCP. Но поскольку узел будет ждать накопления данных для отправки партнеру, он может присоединить уведомление ACK к следующей порции данных, а не отправить его сразу в отдельном пакете."
И далее как отключить алгоритм Neagle.
Digitman (2004-01-22 16:06:00) [8]
> Instant (22.01.04 13:48) [27]
оригинальный авторский вопрос, олух ты царя небесного, прозвучал так :
> процедура send не всегда отправляет сразу весь размер данных
> который ей указан
это означает, что автор инициализировал гнездо в неблок режиме и просит от Винсок отправить, к примеру, 1 мб данных, а Винсок ему возвратил (как рез-т вызова ф-ции Send) 8192 байт ? Это что - нонсенс ? Или ты утверждаешь, что это не так ? Где твои контраргументы ?!! Противоречащие вышеприведенным ?!!!
Digitman (2004-01-22 16:00:00) [9]
> Instant
Сударь, ты хам !!
По теме тайм-аутов, куда ты уводишь автора, еще раз скажу : логика использования тайм-аутов здесь как минимум некорректна ... я съем свою шляпу, если кто-то приведет мне цитату из офиц.док-ции MS (в части ее реализации Winsock, TDI и стека протоколов), где идет речь о подборе каких-то там тайм-аутов
Admin_voyag (2004-01-22 15:26:00) [10]Чего вы все спорите. Для того чтобы сокет (send) не ждал time out или полного заполнения буфера выставите его в режим TCP_NODELAY и все. Send будет отпрвлять только сколько было указано в команде.
ixania (2004-01-22 15:15:00) [11]Зачем всё это, оставте блокирующий режим и возьмите ovelapped I/O, тогда система будет отправлять и принимать данные из/в ваш буфер напрямую и проблема с нехваткой системных буферов отпадет. Конечно насколько я знаю больше чем 64Кб за раз никак, но это более чем достаточно.
Verg (2004-01-22 14:07:00) [12]
> zxc (22.01.04 13:57) [28]
> 2 Verg © (22.01.04 13:40) [25]
>
> > Я че-то не пойму... ты думаешь, что тебя обманывают?
>
> читай сообщения внимательнее, а вообще наверное и правдо
> врут, хорошо что ты сказал ;)))
Ну хорошо, тебе видней.
zxc (2004-01-22 13:57:00) [13]2 Verg © (22.01.04 13:40) [25]
> Я че-то не пойму... ты думаешь, что тебя обманывают?
читай сообщения внимательнее, а вообще наверное и правдо врут, хорошо что ты сказал ;)))
Instant (2004-01-22 13:48:00) [14]Удалено модератором
Примечание: Хамишь братец...
Fredericco (2004-01-22 13:47:00) [15]2 Verg © (22.01.04 13:40) [25]
> Я че-то не пойму... ты думаешь, что тебя обманывают?
:-))))
Verg (2004-01-22 13:40:00) [16]
> ак в данном случаи им как раз хватает места, если бы не
> хватало можно было бы расширить в любой момент.
Короче, если send сказала, что не всем хватает места, значит так оно и есть.
Я че-то не пойму... ты думаешь, что тебя обманывают?
zxc (2004-01-22 13:31:00) [17]>Яж пишу: "которым не хватило места..."
так в данном случаи им как раз хватает места, если бы не хватало можно было бы расширить в любой момент.
(to Digitman) в рабочую перевозку эдак часов 6 вечера, водила так не трогает, ему хоть бы двери закрыть...
так сокет как раз таки в блокирующем режиме, и возвращает бывает размер отправленного отличающегося значения размера который был ему передан в качестве параметра, а за транслит спасибо.
(to Instant) спасибо.
всем спасибо.
Digitman (2004-01-22 13:24:00) [18]
> Instant (22.01.04 13:20) [21]
> если же не все данные отправятся, то попробуй поиграться
> с таймаутом, если не помогло, то эта уже проблема сети,
> либо принимающего гнезда.
дурней логики не придумать
Digitman (2004-01-22 13:22:00) [19]если же водила 30-местного ТС ждет непонятно чего, в то время как село 20 пассажиров и на остановке больше нет никого, то на это существует "сразу же дать чаевые" и с возгласом "Трогай , братец !" немедля двинуться к месту назначения (это как ассоциация с системным TDI-механизмом flush buffers)
Instant (2004-01-22 13:20:00) [20]какие трамваи? хоть тралейбусы не вплели =)
если ты правельно используешь сокет, то смело можешь отправлять данные, размер которых не привышает допустимый (см. setsockopt), если же не все данные отправятся, то попробуй поиграться с таймаутом, если не помогло, то эта уже проблема сети, либо принимающего гнезда.