![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| XSInet |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 4.1.2006 Репутация: нет Всего: нет |
Есть буфер на 10 байт
recv(Sock, buffer, sizeof(buffer), 0) Так вот, если пришлют 11 байт (>10), то recv вызовется 2 раза. Как этого избежать ? |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 53 Всего: 484 |
Перед получением данных из сокета, проверь кол-во байт в буфере.
Если меньше ожидаемого, то не читай или читай столько, сколько есть. Проверить кол-во байт в буфере можно так:
|
|||
|
||||
| XSInet |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 4.1.2006 Репутация: нет Всего: нет |
Я на API пишу.
|
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 53 Всего: 484 |
Ну тогда так:
|
|||
|
||||
| XSInet |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 4.1.2006 Репутация: нет Всего: нет |
Всё равно второй раз процедуру вызывает. Или я что-то не понял ?
|
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 53 Всего: 484 |
ioctlsocket это функция wsock32.dll
Она записывает в переменную BytesKol кол-во байт в буфере сокета. Sock - это твой сокет, который ты используешь в recv(Sock, buffer, sizeof(buffer), 0) Что тут непонятно? |
|||
|
||||
| Rouse_ |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 469 Регистрация: 23.4.2005 Репутация: 5 Всего: 29 |
Добавлено @ 08:35 Эээ...
|
||||
|
|||||
| XSInet |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 4.1.2006 Репутация: нет Всего: нет |
По чему то не работает этот код:
Фругмент:
Извиняюсь что на С++. Так вот функция RECV просто "пролистывается", т.е. не выполняется. На ней программа не останавливается, хотя Client_Socket - блокирующий сокет Это сообщение отредактировал(а) XSInet - 4.5.2006, 18:10 |
|||
|
||||
| Rouse_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 469 Регистрация: 23.4.2005 Репутация: 5 Всего: 29 |
Еще бы...
Тут нарушена вся логика. Какой RECV может быть на входящем ACCEPT? Даже на асинхронке для этого отдельный калбэк висит. WSAAsyncSelect должен быть вызван ДО этого события (что собственно у тебя по всей видимости и сделано) recv должен быть вызван на событии чтения, а именно FD_READ Добавлено @ 00:35 ЗЗЫ: Это не может быть блокирующим сокетом. Научись отличать три модели транспорта. Блокирующий, неблокирующий и асинхронный. Вникай до полного просветления: http://book.itep.ru/ |
|||
|
||||
| XSInet |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 4.1.2006 Репутация: нет Всего: нет |
А какой же он тогда ? На recv Он как раз блокирующий. Вот после WSAAsyncSelect(Client_Socket, ...) он становится асинхронным. |
|||
|
||||
| Rouse_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 469 Регистрация: 23.4.2005 Репутация: 5 Всего: 29 |
Если приходит FD_ACCEPT значит он уже не блокирующий. Ты информацию по моей ссылке изучил? |
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |