Эта общая схема иллюстрируется в следующем фрагменте:
use IO::,Socket; use Errno qw (EWOULDBLOCK EINPROGRESS) ; use IO::Select; my $TIMEQUT = 10; my $sock = IO::Socket::INET->new ( Proto => ‘tcp’ , Type => SOCK_STREAM) or die $@; $sоck ->bloking (0); my, $addr = sockaddr_in (80, inet_aton(‘192.168.3.1’) ) ; my $result = $sock->connect ($addr);
Поскольку предусмотрено выполнение подключения вручную, методу new () модуля IO::Socket не передаются параметры PeerAddr или PeerHost, поскольку любой из них активизирует попытку подключения. Вместо этого передаются параметры Proto и Туре для обеспечения создания сокета TCP. Если сокет был создан успешно, он переводится в неблокирующий режим путем передачи ложного значения параметра методу blocking (). Теперь необходимо явно выполнить подключение сокета, передав его функции connect () . Поскольку функция connect () не допускает применения таких же сокращенных способов указания имен, как объектно-ориентйрованный метод new(), необходимо явно указать упакованную структуру адреса Internet с использованием функций sockaddr_in () и inet_aton (), описанных ранее, и использовать ее в качестве второго параметра функции connect ().
Напомним, что функция connect () возвращает код результата, по которому можно узнать, было ли соединение установлено успешно. В некоторых случаях, таких как подключение к адресу петли обратной связи, неблокирующий вызов функции connect () выполняется немедленно и возвращает истинный результат. Однако в большинстве случаев этот вызов возвращает ряд ненулевых кодов результата. На практике часто встречается код результата ЕINPROGRESS, который просто указывает, что операция неблокирующего подключения продолжается и необходимо периодически проверять, не была ли она завершена.