Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.46 MB
Время: 0.01 c
1-99647
AndreySoft
2003-12-16 01:12
2003.12.30
TPanel не такой как TEdit...


1-99587
Clift
2003-12-17 15:23
2003.12.30
Кнопка /Пуск/


14-99752
Думкин
2003-12-06 18:58
2003.12.30
Отчет по Дельфи № 12 статья 135. Новосибирск.


1-99591
frost
2003-12-17 11:10
2003.12.30
Internal error SY576


14-99705
Dimaz-z
2003-12-09 14:12
2003.12.30
Будущее Delphi в целом.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский