![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
про send
zxc © (2004-01-21 17:01:00)процедура send не всегда отправляет сразу весь размер данных который ей указан, как можно это обойти??
Digitman (2004-01-22 13:18:00) [21]
> какова причина такого странного поведения пассажиров?
это уже не поведение пассажиров, а поведение "водителя кобылы", который может иметь предписание трогать сразу же после посадки хотя бы и даже одного пассажира, а может и не иметь оного и трогать в путь по своему усмотрению
Verg (2004-01-22 13:17:00) [22]
> нет конечно, если трамвай расчитан допустим на 30 человек,
> а внего сели только 20, зачем ждать следующий трамвай когда
> можно сесть в этот? какова причина такого странного поведения
> пассажиров?
Яж пишу: "которым не хватиломеста..."
Нет, не это поведение не пассажиров, а как раз водителя трамвая, если входит 30, а на остановке40 людей, то водитль закроет двери после 30-го, и всех делов. А 10-рым надо ждать следующего.
Digitman (2004-01-22 13:14:00) [23]Если размер внутреннего буфера транспортной системы недостаточен для захвата/удержания ВСЕХ данных, которые затребованы к транспортировке прикладной задачей, ф-ция Send блокирует выполнение вызывающего кодового потока (вполть до передачи ВСЕХ затребованных данных), если только гнездо на момент вызова ф-ции не находится в неблокирующем режиме.
Для поточно-ориентированных гнезд в неблокирующем режиме ф-ция вернет фактическийразмер принятых к транспортировке данных, который может лежать в диапазоне от 1 байт до полного затребованного размера, и этот возвращенный размер зависит от состояния "наполненности" (на момент вызова ф-ции) локального буфера передачи и удаленного буфера приема.
размер системного буфера передачи имеет фикс.размер, по умолчанию он как правило равен 4кб (вполне объяснимый размер с т.з. гранулярности и механизма стр.адресации), но может быть изменен в любой момент между send-вызовами
zxc (2004-01-22 13:13:00) [24]>При перевозке нет, а при посадке?
>Вот твой случай и есть "посадка пассажиров". Что должны делать >пассажиры, которым не хавтило места в трамвае?
>Ждать следующего. Не так ли?
нет конечно, если трамвай расчитан допустим на 30 человек, а внего сели только 20, зачем ждать следующий трамвай когда можно сесть в этот? какова причина такого странного поведения пассажиров?
Fredericco (2004-01-22 13:11:00) [25]Если ты отправляешь 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.
Verg (2004-01-22 13:10:00) [26]
> не стоит приводить подобных сравнений, трамвай не отсекает
> пассажиров при перевозке. и сколько в него людей войдёт
> столько и выйдёт. хотя кто как...;)
При перевозке нет, а при посадке?
Вот твой случай и есть "посадка пассажиров". Что должны делать пассажиры, которым не хавтило места в трамвае?
Ждать следующего. Не так ли?
zxc (2004-01-22 12:57:00) [27]>Fredericco
то что по сети сначало отправляется старший байт, а потом младший это ты прав, но вот на счёт разбеения пакетов именно как 1,2,8... такого я не нашёл.
Fredericco (2004-01-22 12:49:00) [28]Хотя бы вот
http://www.ccc.ru/magazine/depot/97_08/read.html?0103.htm
zxc (2004-01-22 12:37:00) [29]>Протокол поточный, данные делются на блоки 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.
пояни как ты это понимаешь.
Digitman (2004-01-22 12:22:00) [30]
> 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.
ты читал это ? вник ?
Fredericco (2004-01-22 12:07:00) [31]
> процедура send не всегда отправляет сразу весь размер данных
> который ей указан
Send возвращает число отличное от длины отправляемых данных.
> ограниечение буфера тут не причём, если передавать небольшие
> пакеты данных, при условии что размер отправляемого пакета
> меньше чем размер передающего буфера выделленный операционной
> системой, то всё равно не всегда сразу отправляется весь
> пакет.
Протокол поточный, данные делются на блоки 1К, 2К, 8К и т.д. и отправлятся по блокам, соответственно так и приходят. Короче, может быть такое: отправляешь "АБВ", а приходит "А", "Б", "В".
Какая из двух ситуаций твоя?
zxc (2004-01-22 11:59:00) [32]>Можно узнать как конкретно ты это определил?
определил что?
Fredericco (2004-01-22 11:57:00) [33]Можно узнать как конкретно ты это определил?
zxc (2004-01-22 11:31:00) [34]>Может имеется ввиду, что данные приходят не единым блоком, а в несколько?
т.е?? о приёме данных вопрос не стоит. имеется ввиду проблема именно с функцией send.
Fredericco (2004-01-22 10:43:00) [35]2 zxc
Может имеется ввиду, что данные приходятне единым блоком, а в несколько?
zxc (2004-01-21 22:32:00) [36]описка TCP/IP
zxc (2004-01-21 22:30:00) [37]>Хотя бы ограниечние на объемы буферов передатчика транспортного уровня включая размер передающего буфера самого сокета.
ограниечение буфера тут не причём, если передавать небольшие пакеты данных, при условии что размер отправляемого пакета меньше чем размер передающего буфера выделленный операционной системой, то всё равно не всегда сразу отправляется весь пакет.
речь идёт как раз именно о блокирующем сокете. и ещё огромная прозба назвать причины такого сокетного беспредела.
>Ты вообще о каком протоколе-то говоришь?
о всеми любимом ICP/IP.
>Тебе нужно только чтобы "все передало"?
зачем всё сразу??? естественно небольшими пакетами данных. (2~4kb).
>Или все же, чтобы еще и кто-то принял все , что ты передал в неискаженном виде ?
что значит ещё кто то?
> А то вопрос похож на: "Трамваи ездят только по рельсам, как это можно обойти?"
не стоит приводить подобных сравнений, трамвай не отсекает пассажиров при перевозке. и сколько в него людей войдёт столько и выйдёт. хотя кто как...;)
а если попытаться модифицировать время таймаута?? сможет ли это решить данную проблему? а то сети нет, проверить негде.
заранее спасибо.
Verg (2004-01-21 18:51:00) [38]
> zxc (21.01.04 17:59) [2]
> >Поверь, нешуточные.
> приведи список причин. кроме сети которая теряет пакеты.
>
1.
а) Хотя бы ограниечние на объемы буферов передатчика транспортного уровня включая размер передающего буфера самого сокета.
Для неблокирующего сокета, при недостатке места в этих буферах send вернется немедленно с ошибкой WSAEWOULDBLOCK. Если свободное место есть, то ядро скопирует в свои буфера сколько сможет байт и это количество вернется в кач-ве рез-та send.
б) "кроме сети которая теряет пакеты." - ага, эта причина так, пустяк, капризы сеткописателей...
Ты вообще о каком протоколе-то говоришь?
Тебе нужно только чтобы "все передало"?
Или все же, чтобы еще и кто-то принял все , что ты передал в неискаженном виде?
> >Это просто надо грамотно учитывать
> грамотно учитывать с какой точки зрения?
2. С точки зрения взаимодействия с передающим механизмом сокета, который представлен ф-цией send/sendto. Придется играть по его правилам.
А то вопрос похож на: "Трамваи ездят только по рельсам, как это можно обойти?"
zxc (2004-01-21 17:59:00) [39]>Поверь, нешуточные.
приведи список причин. кроме сети которая теряет пакеты.
>Это просто надо грамотно учитывать
грамотно учитывать с какой точки зрения?
Verg (2004-01-21 17:11:00) [40]
> как можно это обойти??
Обходить нельзя - будет большой "вред здоровью".
Не отправляет все данные сразу - на это есть его собственные объективные причины. Поверь, нешуточные.
Это просто надо грамотно учитывать.