Правильно ли я понимаю смысл этих сообщений: FD_RECV - Получает окно когда пришли данные для чтения, то есть физически данные уже получены и хранятся где то в памяти? FD_SEND - данные отправлены. Означает ли это что другой комп. в сети эти данные получил ?
FD_RECV - буфер для чтения не пуст и готов к чтению. Сколько именно удалось считать, скажет recv\WSARecv FD_SEND - буфер для записи не полон и готов к вызову send/WSASend, который и скажет, сколько байт удалось отправить до заполнения буфера. P.S. Все мучаете LSP? Как успехи?
Блин перепутал FD_RECV c FD_READ FD_SEND c FD_WRITE для FD_READ, FD_WRITE мои рассуждения правильны ? SoftCreator В целом продвигаются, хотя есть не понятные моменты но они просветляются ) П.С интересно что этого в течении нескольких часов не замечал, а вот сейчас раз и просвещение )
Я то думал откуда он взял эти коды. Читаем msdn. FD_READ Socket s ready for reading. FD_WRITE Socket s ready for writing.
Сокет готов для чтения? Сокет готов для записи? англ. знаю плохо по этому не уверен в корректности перевода. в мсдн вот что нашол: FD_WRITЕ - Issues notification of readiness for writing FD_READ - Issues notification of readiness for reading. Мож кто сообщит тайну этих слов, переводчик это не переваривает(.
Все то, что я написал, как раз для них и есть Я просто не помнил их точное название. Нужно это вот для чего: - если Вы получили FD_READ, значит, Вы можете вызвать recv и считать хотя бы один байт - если Вы получили FD_WRITE, значит, Вы можете вызвать send и передать хотя бы один байт Если это делать, не получая таких сообщений, на неблокирующих сокетах получаем пустую трату процессорного времени; если бы такое делали на блокирующих (в теории, конечно, т.к. FD_XXXX придут только для неблокирующего сокета) - подвисание. P.S. И еще - если пришло FD_READ и вызван recv, который считал не все данные, придет еще один FD_READ.
XshStasX А до конца просмотреть WSAAsyncSelect поленился ? Там в конце перечислены все конкретные условия при которых генерируются эти сообщения. В частности FD_WRITE шлется в случаях, когда возможен вызов send или sendto, а именно 1) после вызова самого WSAAsyncSelect, 2) после установки соединения через connect или accept, 3) после снятия блокировки передачи, если предыдущий send завершился с ошибкой WSAEWOULDBLOCK
В если сделан recv(buf,50,0) хотя реально на компе только 20байт имеется данных. тоесть за первый запрос мы считаем 20 байт, потом когда придут данные нам придет сообщение FD_READ и мы опять считаем данные , так ? Или же эти недостающие данные будут считаны автоматом а нам придет только извещение FD_READ ?? И еще если мы просто получаем данные с флагом MSG_PEEK, эти данные как можно еще сбросить с буфера ?