Форум: "Сети";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];
ВнизWinSock.select Найти похожие ветки
← →
Narayan (2003-11-02 23:38) [0]Все время таймаут. Что не так ?
procedure TForm1.Button1Click(Sender: TObject);
var
WSAData:TWSAData;
FSocket:TSocket;
addr:TSockAddr;
host:String;
port,err:integer;
ps: PFDSet;
s: TFDSet;
t: PTimeVal;
begin
//host:="rambler.ru";
host:="81.19.66.50";
port:=80;
if WSAStartup($101,WSAData)<>0 then Exit;
addr.sin_family:=AF_INET;
addr.sin_addr.S_addr:=inet_addr(pchar(host));
FSocket:=socket(AF_INET,SOCK_STREAM,0);
if FSocket=INVALID_SOCKET then Exit;
addr.sin_port:=htons(port);
FD_ZERO(s);
FD_SET(FSocket,s);
new(ps);
PFDSet(ps)^ := s;
new(t);
t^.tv_sec:=10;
t^.tv_usec:=10;
err:=WinSock.select(0,ps,nil,nil,t);
Case err Of
SOCKET_ERROR: ShowMessage("SOCKET_ERROR");
0: ShowMessage("TimeOut");
Else
Begin
// TODO
end;
end;
freemem(t);
freemem(ps);
WSACleanup;
end;
← →
Digitman (2003-11-03 08:05) [1]на основании чего ты сделал умозаключение о некоем "таймауте" как причине отказа ф-ции select() ?
← →
Digitman (2003-11-03 08:32) [2]select returns the total number of descriptors which are ready and contained in the fd_set structures, zero if the time limit expired, or SOCKET_ERROR if an error occurred. If the return value is SOCKET_ERROR, WSAGetLastError can be used to retrieve a specific error code.
← →
Digitman (2003-11-03 08:41) [3]кр. всего прочего, что ты ожидаешь от ф-ции select(), если ты не вызвал перед этим ни bind() ни listen() ни connect() ?
и почему protocol-параметр у ф-ции socket() равен 0 ?
← →
Narayan (2003-11-03 08:51) [4]2 [1] Digitman © (03.11.03 08:05)
Не отказа.
Вобще-то с буржуйским вроде не враждую.
select returns the total number of descriptors which are ready and contained in the fd_set structures, zero if the time limit expired, or SOCKET_ERROR if an error occurred.
Я правильно понимаю?
Функция селект, должна из переданного ей набора(1) исключить сокеты, в данном случае нечитабельные. Так?
Создаю сокет, ни bind ни listen, ничего не делаю, сразу проверяю.
..и ожидаю получить пустой массив(1).
Или я ничего не понимаю?
← →
Digitman (2003-11-03 09:03) [5]
> в данном случае нечитабельные.
с чего гнездо станет "читабельным", если ты не вызвал ни connect() ни listen() ? которые без предшествующего bind() даже не выполнятся успешно ?
> и ожидаю получить пустой массив
ты его и получаешь, ибо единственное гнездо, которое ты создал, не инициировано для выполнения какой-либо конкретной операции - запуск операции установки коннекта или "прослушивание" порта
← →
Narayan (2003-11-03 09:08) [6]2 [3] Digitman © (03.11.03 08:41)
> и почему protocol-параметр у ф-ции socket() равен 0 ?
указываю 6 - ничего не меняется
← →
Digitman (2003-11-03 09:15) [7]
> указываю 6 - ничего не меняется
указание протокола нужно для последующих конкретных операций с гнездом
ты же никаких операций не инициируешь вообще, поэтоту внутренние управляющие структуры гнезда (как объекта Winsock) не содержат инф-ции о наступлении каких-либо гнездовых событий
ф-ция же select() как раз и предназначена для синхронного получения инф-ции о факте возникновения каких-либо событий, ассоциированных с одним или более гнезд
← →
Digitman (2003-11-03 09:20) [8]
> Narayan
видишь ли, гнездо в winsock - это просто некая структура, хранящая инф-цию о сеансе взаимодействия прикл.задачи с TDI
т.е. гнездо есть некое промежуточное звено, некий "класс", инкапсулирующий ф-ции сессионного взаимодействия прикл.задачи с драйвером TDI
← →
Narayan (2003-11-03 10:05) [9]Кажется понял - меня ввела в задлуждение фраза
...zero if the time limit expired...
Работает-то правильно. Только зря панику навёл.
select возвращает кол-во гнёзд оставшихся в массиве(1).
У меня оно соотв-но 0.
А понял вот что. По истечении промежутка времени указанного в TimeVal ни одно гнездо в массиве(1) не стало читабельным.
Все верно ?
← →
Digitman (2003-11-03 10:09) [10]
> Все верно ?
разумеется)
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.12.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c