Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.30;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
14-99765
mur
2003-12-06 16:26
2003.12.30
вывод дерева на экран


3-99457
3LoBit
2003-12-03 16:27
2003.12.30
Ошибка Field ReadOnly в TClientDataSet


1-99608
Vitaliygavrilov
2003-12-17 10:55
2003.12.30
Возможно ли при работе программы изменить ее интерфейс


14-99740
Moscower
2003-12-05 15:47
2003.12.30
В воскресенье в РФ выборы в ГД


11-99511
newer
2003-04-09 03:16
2003.12.30
KOL и окна