Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.03;
Скачать: CL | DM;

Вниз

Странное поведение неблокирующего TCP-сокета   Найти похожие ветки 

 
Григорьев Антон ©   (2004-07-22 17:06) [0]

В справке написано, что функция send возвращает число реально отправленный байт (т.е. реально положенных в исходящий буфер сокета). Так вот, кто-нибудь когда-нибудь видел, чтобы эта функция для неблокирующего TCP-сокета возвращала положительное значение, меньшее размера переданного ей буфера? У меня получается, что при работе с удалённым компьютером она всегда либо целиком кладёт в буфер то, что ей передано, либо возвращает ошибку. Мои эксперименты выявили следующую закономерность:

1. Если буфер пуст, в буфер кладутся данные размером до примерно 30 мегабайт независимо от значения опции SO_SNDBUF. При больших размерах передаваемых данных возникает ошибка WSAENOBUFS.

2. Если на момент вызова send данные в буфере сокета уже есть, но размер этих данных хотя бы на один байт меньше, чем SO_SNDBUF, можно положить ещё данные размером как минимум 10 мегабайт.

3. Если на момент вызова send в буфере сокета лежит SO_SNDBUF или больше байт, возникает ошибка WSAEWOULDBLOCK.

На обоих компьютерах, участвовавших в эксперименте, стоит Windows 2000 Advanced Server. Пробовал устанавливать разные размеры буфера, в т.ч. и не кратные 4096 - сделанные выводы остаются в силе.

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


 
Digitman ©   (2004-07-22 17:15) [1]

а тебе нужно об этом знать ? в подробностях ?

те результаты, которые тебе возвращяет текущий WinSock Provider (WSP), полностбю документированы, и нет повода задумываться над тем, что он там творит у себя внутри


 
Григорьев Антон ©   (2004-07-22 18:48) [2]

Интерес, конечно, в основном теоретический. Просто поэкспериментировал после нашего предыдущего разговора на эту тему, вот и стало интересно.

А где документировано поведение TCP/IP WSP? В MSDN"е я это найти не смог.


 
Rouse_ ©   (2004-07-22 20:53) [3]

> 1. Если буфер пуст, в буфер кладутся данные размером до примерно 30 мегабайт независимо от значения опции SO_SNDBUF. При больших размерах передаваемых данных возникает ошибка WSAENOBUFS.

2. Если на момент вызова send данные в буфере сокета уже есть, но размер этих данных хотя бы на один байт меньше, чем SO_SNDBUF, можно положить ещё данные размером как минимум 10 мегабайт.


1. Не эксперементировал по поводу неблокирующего именно, но в асинхронном укладывал туда спокойно в примерно 4 раза больше одним махом...

2. В том же асинхронном утверждение будет неверно так как сразу придет WSAEWOULDBLOCK


 
Rouse_ ©   (2004-07-22 20:55) [4]

> А где документировано поведение TCP/IP WSP?
RFC, номер к сожалению не помню...


 
Григорьев Антон ©   (2004-07-23 10:29) [5]


> Rouse_ ©   (22.07.04 20:53) [3]


> 1. Не эксперементировал по поводу неблокирующего именно,
> но в асинхронном укладывал туда спокойно в примерно 4 раза
> больше одним махом...


Думаю, это сильно зависит от количества свободных ресурсов. У меня точное число менялось от запуска к запуску, поэтому я и написал "около".

> 2. В том же асинхронном утверждение будет неверно так как
> сразу придет WSAEWOULDBLOCK


А вот это интересно. Обязательно проверю.


 
Rouse_ ©   (2004-07-23 10:37) [6]

> [5] Григорьев Антон ©   (23.07.04 10:29)
Если у тебя не вернется WSAEWOULDBLOCK - выложи код которым проверял, я у себя им же проверю...

ЗЫ: ХР SP1 D7


 
Анонимщик ©   (2004-07-23 12:56) [7]

У меня регулярно наблюдаются ситуации, когда SendBuf возвращает положительное значение, меньше размера переданного буфера. Даже в случаях
SendBuf(myInt, SizeOf(myInt))
Win2000


 
Анонимщик ©   (2004-07-23 13:10) [8]

Поспешил наврать, пока не верьте.



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

Текущий архив: 2004.10.03;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
14-1095256320
QuasiLamo
2004-09-15 17:52
2004.10.03
Сколько стоит беспроводная сеть?


14-1095279088
Гранд операнд
2004-09-16 00:11
2004.10.03
Что делать?


14-1095161406
frankvi
2004-09-14 15:30
2004.10.03
PDF Viewer


4-1093435027
FreeMan1
2004-08-25 15:57
2004.10.03
LowLevelKeyboardProc


1-1095276056
lipskiy
2004-09-15 23:20
2004.10.03
Почему ComponentCount не включает в себя динамические объекты?