Приемный и отправной буферы в WinSock
От: Аноним  
Дата: 01.03.04 10:04
Оценка:
Возникшие вопросы не ограничиваются топиком.
Имеется:
WinSock 1.1, и сокеты работающие в асинхронном режиме. Подписка на события осуществляется через WSAAsyncSelect.

Вопросы:
1. У каждого сокета есть свой буфер отправки, размер которого регулируется setsockopt. Предположим он равен 1К. Тогда каким образом мне удавалось запихнуть гораздо большие объемы за один send? Получается у сокета этих отправных буферо несколько? Или он успевает все отправлять? Скажем, если писать очень большой блок данных, то WSAEWOULDBLOCK не появлялся, а сразу возникал WSAENOBUFS. Я пробовал разбивать массив отправляемых данных на порции, равные размеру отправного буфера. Тогда, если не второй, то третий send возвращал SOCKET_ERROR:WSAEWOULDBLOCK — то есть жди FD_WRITE. Отсуда главный вопрос: КАКИМИ ПОРЦИЯМИ МОЖНО ПИХАТЬ ДАННЫЕ В send?
2. Интересные вопросы возникли и на приеме. Предположим, что отправной буфер на отправной стороне и приемный буфер на приемной стороне имеют объем 256К. Я передаю данные порциями по 256К. Иногда на приемной стороне появляются нормальнве куски размером 128-256К, Но иногда вся порция может быть разбита на мелкие куски по 10К. Я конечно понимаю, что TCP не обязана мне давать данные теми же порциями, что я их и отсылал, но зачем она так мелко дробит эти порции(причем иногда дробит, а иногда не дробит)? Можно ли это как-нибудь победить (или исскуственно принудить), чтобы не обрабатывать вместо одного FD_READ несколько десятков.
3. Почему FD_CONNECT возникает раньше FD_ACCEPT? Причем если не обрабатывать FD_ACCEPT, то все равно приходит FD_ACCEPT без ошибки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.