Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Вниз

про send   Найти похожие ветки 

 
zxc   (2004-01-21 17:01) [0]

процедура send не всегда отправляет сразу весь размер данных который ей указан, как можно это обойти??


 
Verg ©   (2004-01-21 17:11) [1]


> как можно это обойти??


Обходить нельзя - будет большой "вред здоровью".
Не отправляет все данные сразу - на это есть его собственные объективные причины. Поверь, нешуточные.

Это просто надо грамотно учитывать.


 
zxc   (2004-01-21 17:59) [2]

>Поверь, нешуточные.
приведи список причин. кроме сети которая теряет пакеты.

>Это просто надо грамотно учитывать
грамотно учитывать с какой точки зрения?


 
Verg ©   (2004-01-21 18:51) [3]


> zxc   (21.01.04 17:59) [2]
> >Поверь, нешуточные.
> приведи список причин. кроме сети которая теряет пакеты.
>


1.
а) Хотя бы ограниечние на объемы буферов передатчика транспортного уровня включая размер передающего буфера самого сокета.
Для неблокирующего сокета, при недостатке места в этих буферах send вернется немедленно с ошибкой WSAEWOULDBLOCK. Если свободное место есть, то ядро скопирует в свои буфера сколько сможет байт и это количество вернется в кач-ве рез-та send.

б) "кроме сети которая теряет пакеты." - ага, эта причина так, пустяк, капризы сеткописателей...

Ты вообще о каком протоколе-то говоришь?
Тебе нужно только чтобы "все передало"?
Или все же, чтобы еще и кто-то  принял все , что ты передал в неискаженном виде ?


> >Это просто надо грамотно учитывать
> грамотно учитывать с какой точки зрения?


2. С точки зрения взаимодействия с передающим механизмом сокета, который представлен ф-цией send/sendto. Придется играть по его правилам.

А то вопрос похож на: "Трамваи ездят только по рельсам, как это можно обойти?"


 
zxc   (2004-01-21 22:30) [4]

>Хотя бы ограниечние на объемы буферов передатчика транспортного уровня включая размер передающего буфера самого сокета.

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

>Ты вообще о каком протоколе-то говоришь?
о всеми любимом ICP/IP.

>Тебе нужно только чтобы "все передало"?
зачем всё сразу??? естественно небольшими пакетами данных. (2~4kb).

>Или все же, чтобы еще и кто-то  принял все , что ты передал в неискаженном виде ?
что значит ещё кто то?

> А то вопрос похож на: "Трамваи ездят только по рельсам, как это можно обойти?"
не стоит приводить подобных сравнений, трамвай не отсекает пассажиров при перевозке. и сколько в него людей войдёт столько и выйдёт. хотя кто как...;)

а если попытаться модифицировать время таймаута?? сможет ли это решить данную проблему? а то сети нет, проверить негде.
заранее спасибо.


 
zxc   (2004-01-21 22:32) [5]

описка TCP/IP


 
Fredericco ©   (2004-01-22 10:43) [6]

2 zxc
Может имеется ввиду, что данные приходят не единым блоком, а в несколько?


 
zxc   (2004-01-22 11:31) [7]

>Может имеется ввиду, что данные приходят не единым блоком, а в несколько?
т.е?? о приёме данных вопрос не стоит. имеется ввиду проблема именно с функцией send.


 
Fredericco ©   (2004-01-22 11:57) [8]

Можно узнать как конкретно ты это определил?


 
zxc   (2004-01-22 11:59) [9]

>Можно узнать как конкретно ты это определил?
определил что?


 
Fredericco ©   (2004-01-22 12:07) [10]


> процедура send не всегда отправляет сразу весь размер данных
> который ей указан


Send возвращает число отличное от длины отправляемых данных.


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


Протокол поточный, данные делются на блоки 1К, 2К, 8К и т.д. и отправлятся по блокам, соответственно так и приходят. Короче, может быть такое: отправляешь "АБВ", а приходит "А", "Б", "В".

Какая из двух ситуаций твоя?


 
Digitman ©   (2004-01-22 12:22) [11]


> zxc


вот фрагмент описания ф-ции в хелпе

If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in a nonblocking I/O mode. On nonblocking stream-oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both the local and foreign hosts. The select, WSAAsyncSelect or WSAEventSelect call can be used to determine when it is possible to send more data.

ты читал это ? вник ?


 
zxc   (2004-01-22 12:37) [12]

>Протокол поточный, данные делются на блоки 1К, 2К, 8К и т.д. и отправлятся по блокам, соответственно так и приходят. Короче, может быть такое: отправляешь "АБВ", а приходит "А", "Б", "В".

никогда не слышал о том что при отправки данные делятся на 1,2,3...KB. сыылку на оффициальный первоисточник можно? (прошу простить мою эрудицию)

>Digitman
If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in a nonblocking I/O mode. On nonblocking stream-oriented sockets, the number of bytes written can be between 1 and the requested length, depending on buffer availability on both the local and foreign hosts. The select, WSAAsyncSelect or WSAEventSelect call can be used to determine when it is possible to send more data.

пояни как ты это понимаешь.


 
Fredericco ©   (2004-01-22 12:49) [13]

Хотя бы вот
http://www.ccc.ru/magazine/depot/97_08/read.html?0103.htm


 
zxc   (2004-01-22 12:57) [14]

>Fredericco
то что по сети сначало отправляется старший байт, а потом младший это ты прав, но вот на счёт разбеения пакетов именно как 1,2,8... такого я не нашёл.


 
Verg ©   (2004-01-22 13:10) [15]


> не стоит приводить подобных сравнений, трамвай не отсекает
> пассажиров при перевозке
. и сколько в него людей войдёт
> столько и выйдёт. хотя кто как...;)


При перевозке нет, а при посадке?
Вот твой случай и есть "посадка пассажиров". Что должны делать пассажиры, которым не хавтило места в трамвае?
Ждать следующего. Не так ли?


 
Fredericco ©   (2004-01-22 13:11) [16]

Если ты отправляешь 10000 байт, то, в зависимости от текущего состояния сети, сокет может может отправить их как
1)4096+4096+1808
2)6*1024+1808
3)39*256+16
И другими любыми способами.
Как я сказал про 1 2 4 - это утрировано.
То есть в твоем свлучае, при отправке

> (2~4kb).

Блоки могут быть 4*512,8*256,2*1024 и т.д.
Так же эти блоки не обязательно кратны 2.


 
zxc   (2004-01-22 13:13) [17]

>При перевозке нет, а при посадке?
>Вот твой случай и есть "посадка пассажиров". Что должны делать >пассажиры, которым не хавтило места в трамвае?
>Ждать следующего. Не так ли?

нет конечно, если  трамвай расчитан допустим на 30 человек, а внего сели только 20, зачем ждать следующий трамвай когда можно сесть в этот? какова причина такого странного поведения пассажиров?


 
Digitman ©   (2004-01-22 13:14) [18]

Если размер внутреннего буфера транспортной системы недостаточен для захвата/удержания ВСЕХ данных, которые затребованы к транспортировке прикладной задачей, ф-ция Send блокирует выполнение вызывающего кодового потока (вполть до передачи ВСЕХ затребованных данных), если только гнездо на момент вызова ф-ции не находится в неблокирующем режиме.
Для поточно-ориентированных гнезд в неблокирующем режиме ф-ция вернет фактический размер принятых к транспортировке данных, который может лежать в диапазоне от 1 байт до полного затребованного размера, и этот возвращенный размер зависит от состояния "наполненности" (на момент вызова ф-ции) локального буфера передачи и удаленного буфера приема.

размер системного буфера передачи имеет фикс.размер, по умолчанию он как правило равен 4кб (вполне объяснимый размер с т.з. гранулярности и механизма стр.адресации), но может быть изменен в любой момент между send-вызовами


 
Verg ©   (2004-01-22 13:17) [19]


> нет конечно, если  трамвай расчитан допустим на 30 человек,
> а внего сели только 20, зачем ждать следующий трамвай когда
> можно сесть в этот? какова причина такого странного поведения
> пассажиров?

Яж пишу: "которым не хватило места..."

Нет, не это поведение не пассажиров, а как раз водителя трамвая, если входит 30, а на остановке 40 людей, то водитль закроет двери после 30-го, и всех делов. А 10-рым надо ждать следующего.


 
Digitman ©   (2004-01-22 13:18) [20]


> какова причина такого странного поведения пассажиров?


это уже не поведение пассажиров, а поведение "водителя кобылы", который может иметь предписание трогать сразу же после посадки хотя бы и даже одного пассажира, а может и не иметь оного и трогать в путь по своему усмотрению


 
Instant   (2004-01-22 13:20) [21]

какие трамваи? хоть тралейбусы не вплели =)
если ты правельно используешь сокет, то смело можешь отправлять данные, размер которых не привышает допустимый (см. setsockopt), если же не все данные отправятся, то попробуй поиграться с таймаутом, если не помогло, то эта уже проблема сети, либо принимающего гнезда.


 
Digitman ©   (2004-01-22 13:22) [22]

если же водила 30-местного ТС ждет непонятно чего, в то время как село 20 пассажиров и на остановке больше нет никого, то на это существует "сразу же дать чаевые" и с возгласом "Трогай , братец !" немедля двинуться к месту назначения (это как ассоциация с системным TDI-механизмом flush buffers)


 
Digitman ©   (2004-01-22 13:24) [23]


> Instant   (22.01.04 13:20) [21]


> если же не все данные отправятся, то попробуй поиграться
> с таймаутом, если не помогло, то эта уже проблема сети,
> либо принимающего гнезда.


дурней логики не придумать


 
zxc   (2004-01-22 13:31) [24]

>Яж пишу: "которым не хватило места..."
так в данном случаи им как раз хватает места, если бы не хватало можно было бы расширить в любой момент.

(to Digitman) в рабочую перевозку эдак часов 6 вечера, водила так не трогает, ему хоть бы двери закрыть...
так сокет как раз таки в блокирующем режиме, и возвращает бывает размер отправленного отличающегося значения размера который был ему передан в качестве параметра, а за транслит спасибо.

(to Instant) спасибо.

всем спасибо.


 
Verg ©   (2004-01-22 13:40) [25]


> ак в данном случаи им как раз хватает места, если бы не
> хватало можно было бы расширить в любой момент.


Короче, если send сказала, что не всем хватает места, значит  так оно и есть.
Я че-то не пойму... ты думаешь, что тебя обманывают?


 
Fredericco ©   (2004-01-22 13:47) [26]

2 Verg ©   (22.01.04 13:40) [25]

> Я че-то не пойму... ты думаешь, что тебя обманывают?

:-))))


 
Instant   (2004-01-22 13:48) [27]

Удалено модератором
Примечание: Хамишь братец...


 
zxc   (2004-01-22 13:57) [28]

2 Verg ©   (22.01.04 13:40) [25]

> Я че-то не пойму... ты думаешь, что тебя обманывают?

читай сообщения внимательнее, а вообще наверное и правдо врут, хорошо что ты сказал ;)))


 
Verg ©   (2004-01-22 14:07) [29]


> zxc   (22.01.04 13:57) [28]
> 2 Verg ©   (22.01.04 13:40) [25]
>
> > Я че-то не пойму... ты думаешь, что тебя обманывают?
>
> читай сообщения внимательнее, а вообще наверное и правдо
> врут, хорошо что ты сказал ;)))


Ну хорошо, тебе видней.


 
ixania   (2004-01-22 15:15) [30]

Зачем всё это, оставте блокирующий режим и возьмите ovelapped I/O, тогда система будет отправлять и принимать данные из/в ваш буфер напрямую и проблема с нехваткой системных буферов отпадет. Конечно насколько я знаю больше чем 64Кб за раз никак, но это более чем достаточно.


 
Admin_voyag   (2004-01-22 15:26) [31]

Чего вы все спорите. Для того чтобы сокет (send) не ждал time out или полного заполнения буфера выставите его в режим TCP_NODELAY и все. Send будет отпрвлять только сколько было указано в команде.


 
Digitman ©   (2004-01-22 16:00) [32]


> Instant


Сударь, ты хам !!

По теме тайм-аутов, куда ты уводишь автора, еще раз скажу : логика использования тайм-аутов здесь как минимум некорректна ... я съем свою шляпу, если кто-то приведет мне цитату из офиц.док-ции MS (в части ее реализации Winsock, TDI и стека протоколов), где идет речь о подборе каких-то там тайм-аутов


 
Digitman ©   (2004-01-22 16:06) [33]


> Instant   (22.01.04 13:48) [27]


оригинальный авторский вопрос, олух ты царя небесного, прозвучал так :


> процедура send не всегда отправляет сразу весь размер данных
> который ей указан


это означает, что автор инициализировал гнездо в неблок режиме и просит от Винсок отправить, к примеру, 1 мб данных, а Винсок ему возвратил (как рез-т вызова ф-ции Send) 8192 байт ? Это что - нонсенс ? Или ты утверждаешь, что это не так ? Где твои контраргументы ?!! Противоречащие вышеприведенным ?!!!


 
Admin_voyag   (2004-01-22 16:45) [34]

Автор вопроса спрашивает, как обойти алгоритм задержки при передачи данных, который называется Neagle (если Вам таковой известен) и заставить сокет отправлять те данные, которые в него помещаются. Но это при условии, что передается данных меньше чем размер буфера. Time Outтом здесь называется время ожидания в течении которого должны быть поступлены данные для полного заполнения буфера.
Выдержка из официального руководства Microsoft "Программирование в сетях Windows" (русский перевод) стр. 268,  "Чтобы увеличить эффективность и пропускную способность за счет уменьшения издержек, система выполняет алгоритм Neagle, который позволяет "укрупнить" пакеты TCP. Издержки в том, что длина заголовка TCP для каждого пакета - 20 байт. Расточительно отправлять сообщение по 2 байта с 20-ти байтным заголовком, поэтому когда приложение запрашивает порцию данных, система сможет накапливать данные в течение некоторого времени перед фактической отправкой по сети. Если дополнительные данные за указанный период времени не накопятся, оправка произойдет безусловно.
 Недостаток этого алгоритма - замедление подтверждений о получении данных TCP. Но поскольку узел будет ждать накопления данных для отправки партнеру, он может присоединить уведомление ACK к следующей порции данных, а не отправить его сразу в отдельном пакете."
И далее как отключить алгоритм Neagle.


 
Digitman ©   (2004-01-22 16:53) [35]


> Admin_voyag   (22.01.04 16:45) [34]


из вопроса авторя неочевидно, СКОЛЬКО данных он хочет отправить СРАЗУ ... то ли меньше размера транспортного буфера, то ли больше ... отсюда и недоразумение ... а по поводу nagle-алгоритма - это само собой разумеется


 
Admin_voyag   (2004-01-22 17:25) [36]

Из того же самого руководства стр. 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."
и т.д.
Тут кто-то хотел съесть свою шляпу. Так что вперед.


 
Admin_voyag   (2004-01-22 17:28) [37]

Размер буфера тут не причем, сокет всегда передаст столько сколько указано в третьем параметре функции send. Просто при меньщем коллмчестве произойдет небольшая задержка, а потом инициация передачи. Все уже на практике отработано.


 
Fredericco ©   (2004-01-22 17:36) [38]

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


 
Verg ©   (2004-01-22 17:38) [39]


> 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 len for nonblocking sockets. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.

Ты хоть это читал?

Это MSDN.


 
Digitman ©   (2004-01-23 16:25) [40]


> Admin_voyag   (22.01.04 17:25) [36]


> Третий - len, задает число отправляемых из буфера символов


это - размер ранных. затребованных прикл.задачей к буферизации системным передающим транспортом ... не более того



Страницы: 1 2 вся ветка

Форум: "Сети";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.058 c
3-1078208297
sohat
2004-03-02 09:18
2004.04.04
Знатокам EhLib, Раскрывающийся список в Гриде без lookup поля.


8-1070574471
Suharew
2003-12-05 00:47
2004.04.04
Как работать с рисунками GIF


1-1079210877
AlexT
2004-03-13 23:47
2004.04.04
Stream read error


3-1078816971
Лысый
2004-03-09 10:22
2004.04.04
Готовое приложение


6-1074752837
Hooch
2004-01-22 09:27
2004.04.04
кодировка поля Subject в письме





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский