Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Опять проблемы с RECV 
:(
    Опции темы
XSInet
Дата 2.5.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 4.1.2006

Репутация: нет
Всего: нет



Есть буфер на 10 байт
recv(Sock, buffer, sizeof(buffer), 0)

Так вот, если пришлют 11 байт (>10), то recv вызовется 2 раза. Как этого избежать ? 
PM MAIL   Вверх
Snowy
Дата 2.5.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Перед получением данных из сокета, проверь кол-во байт в буфере.
Если меньше ожидаемого, то не читай или читай столько, сколько есть.
Проверить кол-во байт в буфере можно так:
Код

  ByteKol := Socket.ReceiveBuf(pointer(nil)^,-1);
 
PM MAIL   Вверх
XSInet
Дата 2.5.2006, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 4.1.2006

Репутация: нет
Всего: нет



Я на API пишу. 
PM MAIL   Вверх
Snowy
Дата 2.5.2006, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Ну тогда так:
Код

var
  BytesKol: integer;
begin
  ioctlsocket(Sock, FIONREAD, Longint(BytesKol);
  if BytesKol >= 10 then ...
  else ....
   
PM MAIL   Вверх
XSInet
Дата 2.5.2006, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 4.1.2006

Репутация: нет
Всего: нет



Всё равно второй раз процедуру вызывает. Или я что-то не понял ? 
PM MAIL   Вверх
Snowy
Дата 2.5.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



ioctlsocket это функция wsock32.dll
Она записывает в переменную BytesKol кол-во байт в буфере сокета.
Sock - это твой сокет, который ты используешь в recv(Sock, buffer, sizeof(buffer), 0)
Что тут непонятно? 
PM MAIL   Вверх
Rouse_
Дата 3.5.2006, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 5
Всего: 29



Код

var
  BytesKol: integer;
  buffer: array of Byte;
begin
  ioctlsocket(Sock, FIONREAD, Longint(BytesKol);
  SetLength(buffer, BytesKol);
  // теперь получай


Добавлено @ 08:35 
Эээ... 
Код

ioctlsocket(Sock, FIONREAD, Longint(@BytesKol));
 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
XSInet
Дата 4.5.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 4.1.2006

Репутация: нет
Всего: нет



По чему то не работает этот код:

Фругмент:
Код

case FD_ACCEPT:
    Client_Socket = accept(Accepting_Socket, NULL, NULL);
    MessageBoxA(hwnd, "Client connected", NULL, 0);
        char LOL[10];
        recv(Client_Socket, LOL, 10, 0);
    WSAAsyncSelect(Client_Socket, hwnd, WM_USER+1, FD_READ | FD_WRITE | FD_CLOSE);
    break;


Извиняюсь что на С++.
Так вот функция RECV просто "пролистывается", т.е. не выполняется. На ней программа не останавливается, хотя Client_Socket - блокирующий сокет  

Это сообщение отредактировал(а) XSInet - 4.5.2006, 18:10
PM MAIL   Вверх
Rouse_
Дата 5.5.2006, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 5
Всего: 29



Еще бы...
Тут нарушена вся логика. Какой RECV может быть на входящем ACCEPT? Даже на асинхронке для этого отдельный калбэк висит.
WSAAsyncSelect должен быть вызван ДО этого события (что собственно у тебя по всей видимости и сделано)

recv должен быть вызван на событии чтения, а именно FD_READ

Добавлено @ 00:35 
Цитата(XSInet @  4.5.2006,  19:05 Найти цитируемый пост)
хотя Client_Socket - блокирующий сокет  

ЗЗЫ: Это не может быть блокирующим сокетом. Научись отличать три модели транспорта. Блокирующий, неблокирующий и асинхронный.
Вникай до полного просветления: http://book.itep.ru/ 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
XSInet
Дата 8.5.2006, 04:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 4.1.2006

Репутация: нет
Всего: нет



Цитата

ЗЗЫ: Это не может быть блокирующим сокетом

А какой же он тогда ? На recv Он как раз блокирующий. Вот после WSAAsyncSelect(Client_Socket, ...) он становится асинхронным. 
PM MAIL   Вверх
Rouse_
Дата 10.5.2006, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 5
Всего: 29



Цитата(XSInet @  8.5.2006,  05:46 Найти цитируемый пост)
На recv Он как раз блокирующий. 

Если приходит FD_ACCEPT значит он уже не блокирующий. Ты информацию по моей ссылке изучил? 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0766 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.