Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2012, 21:38   #1
Puhovoi
Пользователь
 
Аватар для Puhovoi
 
Регистрация: 16.10.2010
Сообщений: 47
Радость Проверка состояния массива неблокирующих сокетов

Доброго времени суток!

Изучение работы неблокирующих сокетов решил начать с написания простенького прокси-чекера, позволяющего определить статус соединения с тем или иным прокси.

Код:
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];

Но как сделать - не понимаю.

Заранее спасибо за ответы.
Puhovoi вне форума Ответить с цитированием
Старый 03.07.2012, 11:05   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

select() для этого предназначен. вот пример для проверки одного сокета, а вобще там можно сразу 64 за один вызов проверить:

Код:
type
  pbool = ^boolean;

// --  --
function fdset(s: tSocket; v: pbool; fds: pfdset): pfdset; 
begin
  if (v <> nil) then begin
    //
    FD_SET(s, fds^);
    //
    result := fds;
  end
  else
    result := nil;
end;

// --  timeout in milliseconds --
function select(s: tSocket; r, w, e: pbool; timeout: integer): integer;
var
  fds_r: tfdset;
  fds_w: tfdset;
  fds_e: tfdset;
  //
  fds_rptr: pfdset;
  fds_wptr: pfdset;
  fds_eptr: pfdset;
  //
  tv: tTimeval;
  timeptr: pTimeval;
begin
  if (INVALID_SOCKET <> s) then begin
    //
    fds_rptr := fdset(s, r, @fds_r);
    fds_wptr := fdset(s, w, @fds_w);
    fds_eptr := fdset(s, e, @fds_e);
    //
    if (timeout <> INFINITE) then begin
      //
      if (1 > timeout) then begin
	//
	tv.tv_sec  := 0;
	tv.tv_usec := 0;
      end
      else begin
	//
	tv.tv_sec := timeout shr 10;			// ~ timeout div 1000
	if (1 = timeout) then
	  tv.tv_usec := 10
	else
	  tv.tv_usec := (timeout mod 1000) shl 10;	// ~ (timeout mod 1000) * 1000;
	//
	if (999999 < tv.tv_usec) then
	  tv.tv_usec := 999999;
      end;
      //
      timeptr := @tv;
    end
    else
      timeptr := nil;
    //
    result := WinSock.select(1, fds_rptr, fds_wptr, fds_eptr, timeptr);
    if (1 = result) then begin
      //
      if (r <> nil) then r^ := FD_ISSET(s, fds_r);
      if (w <> nil) then w^ := FD_ISSET(s, fds_w);
      if (e <> nil) then e^ := FD_ISSET(s, fds_e);
    end
    else begin
      //
      if (0 = result) then // timeout?
      else
	result := WSAGetLastError();
    end;
    //
  end
  else
    result := WSAENOTSOCK;
end;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проверка символьного массива на принадлежность определенного символа Piro06 Общие вопросы C/C++ 1 15.12.2011 14:58
Проверка ячейки на то содержит ли она значение из массива Maryver Microsoft Office Excel 5 14.04.2011 14:40
проверка массива sergio11 Общие вопросы .NET 0 30.01.2011 10:52
Проверка массива Wander Microsoft Office Excel 7 04.06.2010 10:20
Проверка состояния CheckboxState??? John_chek Компоненты Delphi 1 26.01.2007 11:18