|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Проверка состояния массива неблокирующих сокетов
Доброго времени суток!
Изучение работы неблокирующих сокетов решил начать с написания простенького прокси-чекера, позволяющего определить статус соединения с тем или иным прокси. Код:
var data : twsadata; sock : array [0..9] of tsocket; addr : tsockaddr; blck : u_long; i : integer; t : timeval; begin blck := 1; wsastartup ($101, data); for i := 0 to 9 do begin sock[i] := socket (AF_INET, SOCK_STREAM, 0); while sock[i] = INVALID_SOCKET do sock[i] := socket (AF_INET, SOCK_STREAM, 0); ioctlsocket (sock[i], FIONBIO, blck); addr.sin_family := AF_INET; addr.sin_addr.s_addr := inet_addr (pansichar ('{proxy adress}')); addr.sin_port := htons ({proxy port}); connect (sock[i], addr, sizeof (addr)); end; sleep (1000); for i := 0 to 9 do closesocket (sock[i]); wsacleanup; end; Задача: - загрузить 10 прокси в один поток - попытаться соединиться с каждым в неблокирующем режиме - через N времени проверить открытые сокеты на предмет того, есть ли соединение, или прокси мертв Третий пункт решить не получается, прошу помощи. Грубо говоря, я представляю это так: for i := 0 to 9 do // проверка sock[i]; Но как сделать - не понимаю. Заранее спасибо за ответы. |
#2
|
||||
|
||||
в справке написано:
Цитата:
Код:
var FDSetW: TFDSet; FDSetE: TFDSet; TimeVal: TTimeVal; ... FD_ZERO(FDSetW); FD_ZERO(FDSetE); FD_SET(FSocket, FDSetW); FD_SET(FSocket, FDSetE); TimeVal.tv_sec:=0; TimeVal.tv_usec:=100; select(0, nil, @FDSetW, @FDSetE, @TimeVal); if not FD_ISSET(FSocket, FDSetW) then raise Exception.Create('connect(): timeout'); Пишу программы за еду. __________________ |