Форум: "Сети";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Внизкак сделать 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 вся ветка
Форум: "Сети";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.035 c