Анимация
JavaScript
|
Главная Библионтека Туре => SOCK STREAM, Timeout => 5 ) or die $@; Но в этом случае вы уже не сможете использовать $i или %@, чтобы узнать причину неудачи ~ невозможность подключения или тайм-аут. Иногда бывает удобнее установить тайм-аут вручную, без использования модуля. INADDR ANY - специальный адрес, означающий «прослущивание на всех интерфейсах». Если вы хотите ограничить его конкретным IP-адресом, включите параметр Local Addr в вызов 10:: Socket:: INET->new. При ручном кодировании это делается так: $inet addr = inet aton("208 146 240.I"), Spaddr = sockaddr in($port, $inet addr); bind(S0CKET, Spaddr) or die bind. $!", Если вам известно только имя, действуйте следующим образом: $inet addr = gethostbynameCwww. yahoo, com") or die "Cant resolve www.yahoo.com: S"; Spaddr = sockaddr in($port, $inet addr); bind(S0CKET, Spaddr) or die "bind. $!": > Смотри также- Описание функций socket, bind, connect и gethostbyname в perlfunc{\); доку.мен-тация по стандартным модулям Socket, IO::Socket и Net::hostent; раздел «Internet TCP Clients and Servers» perlipc(\); рецепты 17.2-17.3. 17.2. Написание сервера TCP Проблема Вы хотите написать сервер, который ожидает подключения клиентов по сети к определенному порту. Решение Следующее решение предполагает, что связь осуществляется через Интернет. ТСР-подобные коммуникации на одном компьютере рассматриваются в рецепте 17.6. Воспользуйтесь стандартным (для версии 5.004) классом IO::Socket:;INET: use 10Socket; Sserver = 10::Socket::INET->new(LocalPort => $server port, Type => SOCK STREAM, Reuse => 1, Listen => 10 ) # or SOMAXCONN or die "Couldnt be a tcp server on port Sserver port : S@\n"; 17.2. Написание сервера TCP 609 while ($client = $server->accept()) { # Sclient - новое подключение close($server); Или создайте сокет вручную, что позволит получить полный контроль над ним: use Socket; # Создать сокет socket(SERVER, PF INET, SOCK STREAM, getprotobyname(tcp)); # Чтобы мы могли быстро перезапустить сервер setsockopt(SERVER, SOL SOCKET, SO REUSEADDR, 1); й Построить свой адрес сокета Smy acldr = sockaddr in($server port, 1NADDR ANY); bind(SERVER, $my addr) or die "Couldnt bind to port $server port : $!\n"; # Установить очередь для входящих соединений listen(SERVER, SOMAXCONN) or die "Couldnt listen on port $server port ; $!\n"; Й Принимать и обрабатывать подключения while (accept(CLlENT, SERVER)) { Й Сделать что-то с CLIENT close(SERVER); Комментарий Написать сервер сложнее, чем клиент. Необязательная функция listen сообщает операционной системе, сколько подключений могут находиться в очереди к серверу, ожидая обслуживания. Функция setsockopt, использованная в рещении, позволяет избежать двухминутного интервала после уничтожения сервера перед его перезапуском (полезна при тестировании). Функция bind регистрирует сервер в ядре. Наконец, функция accept последовательно принимает входящие подключения. Числовой аргумент listen определяет количество не принятых функцией accept подключений, которые будут поставлены в очередь операционной системой перед тем, как клиенты начнут получать ощибки «отказ в обслуживании». Исторически максимальное значение этого аргумента было равно 5, но и сегодня многие операционные системы тайно устанавливают максимальный размер очереди равным примерно 20. Сильно загруженные Web-серверы стали распространенным явлением, поэтому многие поставщики увеличивают это значение. Максималь- ный размер очереди для вашей системы хранится в константе SOMAXCONN модуля Socket. Функции accept передаются два аргумента: файловый манипулятор, подключаемый к удаленному клиенту, и файловый манипулятор сервера. Она возвращает IP-адрес и норт клиента, упакованные inet ntoa: use Socket; while (Sclient adclress = accept(CLIENT, SERVER)) { (Sport, Spacked ip) = sockaddr in(Sclient address); Sdotted quad = inet ntoa(Spacked ip); # Обработать В классах IO::Socket accept является методом, вызываемым для манипулятора сервера: while ((Sclient,Sclient address) = Sserver->accept()) { ff .,. Если ожидающих подключений нет, программа блокируется на вызове accept до того, как появится подключение. Если вы хотите гарантировать, что вызов accept не будет блокироваться, воспользуйтесь неблокирующими сокетами: use Fcntl qw(F GETFL F SETFL 0 NONBLOCK); Sflags = fcntl($SERVER, F GETFL, 0) or die "Can t get flags for the socket S\n, Sflags = fcntl($SERVER, F SETFL, Sflags 0 NONBLOCK) or die Cant set flags for the socket, S\n"; Если теперь при вызове accept не окажется ожидающих подключений, accept вернет undef и присвоит $! значение EWOULDBLOCK. Может показаться, что при возвращении нулевых флагов от F GETFL будет вызвана функция die, как и при неудачном вызове, возвращающем undef. Это не так - неошибочное возвращаемое значение fcntl, как и для ioctl, преобразуется Perl в специальное значение "О but true". Для этой специальной строки даже не действуют надоедливые предупреждения флага -w о нечисловых величинах, поэтому вы можете использовать ее в своих функциях, когда возвращаемое значение равно О и тем не менее истинно. [> Смотри также- Описание функций socket, bind, listen, accept, fcntl и setsockopt вperlfunc{\y, страницы руководства fcntl{2), socket(T), setsockopt(2) вашей системы (если они есть); документация но стандартным модулям Socket, IO::Socket и Net;:hostent; раздел Internet TCP Clients and Servers» perHpc{i); рецепты 7.13-7.14; 17.1; 17.3; 17.7. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 [ 197 ] 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 |