Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2012, 09:36   #1
Biohazard
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 78
Вопрос socket как узнать что пришёл ответ?

есть функция
function send(s: integer; var Buf; len, flags: Integer): Integer; stdcall; stdcall; external 'wsock32.dll';

ну вы её знаете и знаете то она делает (отправляет сообщение на сервер, после чего сервер отправляет какой то ответ)

послу этой функции я вызываю слип, а потом читаю, но проблема в том, что я не знаю какой нужно длины слип вызывать,

вопрос: какую функцию использовать, чтобы узнать, что сервер прислал ответ?
Biohazard вне форума Ответить с цитированием
Старый 15.10.2012, 09:39   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

select вам нужна
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.10.2012, 09:54   #3
Biohazard
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 78
По умолчанию

ммм погуглил про неё сейчас, не очень понятно как её юзать

Код:
FD_ZERO(rdfs);
FD_SET(hSocket, rdfs);
tmout.tv_sec := 0;
tmout.tv_usec := 500000;
ievnt := select(0, @rdfs, nil, nil, @tmout);
if (ievnt <= 0) then break;
что то типо того? без таймаута никак не реализовать?

через селект не работает! или я что то не правильно делаю, вот моя функция, только толку нету, меньше ждёт чем надо, сервер ещё не послал ответ а она уже выполнилась и рунтайм получается

Код:
function wait(Socket:integer):integer;
type
  TFDSet = record
    fd_count: Integer;
    fd_array: array[0..63] of Integer;
  end;
  timeval = record
    tv_sec: Longint;
    tv_usec: Longint;
  end;
var
 rdfs:TFDSet;
 tmout: timeval;
begin
  rdfs.fd_array[0] := Socket;
  rdfs.fd_count:=1;
  tmout.tv_sec := 0;
  tmout.tv_usec := 500000;
  result := select(0, @rdfs, nil, nil, @tmout);
end;

Последний раз редактировалось Biohazard; 15.10.2012 в 10:16.
Biohazard вне форума Ответить с цитированием
Старый 15.10.2012, 10:15   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а что вы хотите ждать вечно?
таймаут позволяет подождать опред время, потом или ошибка таймаута или чтото еще сделать можно.

а вы ответ от read проверяете?
у меня подозрение что вы слепо верите в то сколько байт вы прочли.

select дает положительный ответ если можно прочесть с сокета хоть один байт, не гарантируется что вы прочтете сразу все что послано.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.10.2012, 10:18   #5
Biohazard
Пользователь
 
Регистрация: 23.02.2009
Сообщений: 78
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а что вы хотите ждать вечно?
таймаут позволяет подождать опред время, потом или ошибка таймаута или чтото еще сделать можно.
если просто слип стоит даже 1000 то всё работает, а эта функция просто возвращает число, ничего не ожидая, не знаю где глюк, ну и без ожидания соответственно, ошибка вылазит

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
select дает положительный ответ если можно прочесть с сокета хоть один байт, не гарантируется что вы прочтете сразу все что послано.
и чтож там делать? она уже считывает что - ли: как ресв?

Последний раз редактировалось Stilet; 15.10.2012 в 11:22.
Biohazard вне форума Ответить с цитированием
Старый 15.10.2012, 11:46   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Biohazard Посмотреть сообщение
через селект не работает! или я что то не правильно делаю, вот моя функция,
Читайте *внимательно* что именно делает select - вам еще надо проверить fd_set на предмет ответа. Я уж молчу, что надо проверять на предмет ошибок...
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить полный ответ от Socket Shouldercannon Работа с сетью в Delphi 3 09.03.2012 23:05
Как узнать, что Button нажата? shumsheec Общие вопросы Delphi 2 29.06.2011 12:35
Как узнать что за видео-карта? VintProg Свободное общение 5 02.09.2010 19:48
Как узнать что в содержимое буфера обмена добавилось что либо? zotox Общие вопросы Delphi 2 15.09.2009 12:07
DLL!!!Как узнать что PUSH-ит!!! Kuznecov Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 10.02.2009 22:04