Вниз
Скачать: CL | DM;

как сделать time-out на recvfrom?   Найти похожие ветки 

← →
3APA3A ©   (2004-03-22 22:04) [0]

создаю UDP socket
   socket...
   bind...
 и жду пакетов
   recvfrom()..
 надо как-нибудь сделать так, что-бы recvfrom ждал данные не более 3 или 5 секунд... то есть - если в стеке протокола нет данных - recvfrom ждет их 5 секунд и если их так и нет - возвращает управление в программу...


← →
Verg ©   (2004-03-22 22:19) [1]

Воспользуйся классическим способом - select, например:

function WaitForData(S : TSocket; TimeOut : DWORD): integer;
var FDS : TFDset;
   Tv  : TTimeval;
   Ptv : PTimeVal;
begin
 FD_ZERO(FDS);
 FD_SET(S, FDS);
 Ptv := nil;
 if TimeOut <> INFINITE then
 begin
   Tv.tv_sec  := TimeOut div 1000;
   Tv.tv_usec := (TimeOut mod 1000) * 1000;
   Ptv := @Tv;
 end;
 result := select(0, @FDS, nil, nil, Ptv);
end;

Результат ф-ции будет > 0, если есть данные, 0 - если таймаут, SOCKET_ERROR - если произошла какая-нибудь ошибка (WSAGeLastError уточнит)

Можно обявить сокету асинхронный режим и вообще ничего не ждать - будут данные - тебе сообщат (WSAAsyncSelect) оконным сообщением.
Чтобы жить в "одном измерении" с WIN32 можно сокету назначить объект синхронизации - event, чтобы его можно было ожидать наравне/вместе с другим такими же (подобными) объектами как в ф-ции WaitForMultipleObjects или MsgWaitForMultipleObjects, а не только с сокетами же (как в select). Для этого предназначена ф-ция WSAEventSelect, но это уже из WINSock2.
OverLapped IO опять же можно применить, т.е. простейший ReadFile, где вместо хендла файла можно подставить сокет, сформировав и заполнив структуру TOverlapped...
Много способов в общем....


← →
3APA3A ©   (2004-03-22 23:00) [2]

tnx...



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.021 c
7-1080738078
Прямой
2004-03-31 17:01
2004.05.16
Очередь сообщений


3-1081404801
ev
2004-04-08 10:13
2004.05.16
Как передать текст из edit в SQL запрос?


7-1081073322
NV-VETAL
2004-04-04 14:08
2004.05.16
DCOM. Как зарегистрировать клиента с помощью реестра?


4-1079689224
_san_
2004-03-19 12:40
2004.05.16
Проблема с записью в порт


3-1082092566
Litr
2004-04-16 09:16
2004.05.16
Изменение данных




   Наверх