|
|
|
||||||||||||
|
|
Собственный, легко управляемый и профессионально разработанный сайт – необходимый элемент любого бизнеса. Находитесь ли Вы в командировке, в дороге, дома или на отдыхе имея компьютер, подключенный к сети Internet, Вы получаете доступ к управлению Вашим сайтом! |
|||
Сервер TCPСтатьи → Программирование на PHP и Perlего IP-адресу Исходный код:
Написать хороший сервер довольно непросто. К тому же все зависит от поставленной задачи. Существует масса решений этой задачи и опытный программист должен выбрать оптимальный вариант. Сложность так же состоит и в том, что при проектировании программы-сервера необходимо руководствоваться соображениями максимальной стабильности и безопасности.
#!C:/perl/bin/perl -w Как видим, первоначальные шаги при создании сервера мало чем отличаются от аналогичных для клиента (см. Клиент TCP). Сначала сокет идентифицируется. Функция bind связывает созданный сокет с конкретным адресом. С помощью функции listen мы устанавливаем количество подключений, которые будут поставлены в очередь ожидания. SOMAXCONN это константа модуля Socket, которая содержит максимально-допустимый размер очереди входящих подключений. Пусть вас не смущает бессмысленный цикл while. Мы пока просто тестируем работу серверной стороны, поэтому здесь нам этот цикл не нужен. Функция accept принимает входящие подключения. В качестве аргументов эта функция принимает дескриптор, подключаемый к клиенту, и дескриптор серверной стороны. В случае отсутствия входящих подключений функция accept блокирует работу программы. В качестве результата функция accept возвращает идентификатор удаленного сокета, то есть адрес и номер порта упакованный функцией inet_ntoa. while ($work){
sub GetSockAddr{Функция inet_ntoa выполняет конвертацию адреса в его строковое представление. Так же есть обратная функция inet_aton которая преобразовывает, соответственно, из строкового представления в числовое. Дело в том, что функция gethostbyname возвращает адрес уже преобразованный к числовому. Поэтому в функции GetSockName мы не использовали inet_aton. Если бы мы работали не с именами, а непосредственно с IP-адресами, то код функции GetSockName выглядел бы следующим образом: sub GetSockName{Но так как gethostbyname возвращает правильный результат, даже в случае если передаваемое имя является строковым представлением IP-адреса, то inet_aton мы не используем. По поводу inet_aton и inet_ntoa необходимо добавить, что эти функции выполняют платформозависимые преобразования, в соответствии с принятым в системы представлением значений в памяти (тупоконечное, остроконечное). Функция sockaddr_in в списковом контексте
#!C:/perl/bin/perl -w Тут все нам кажется знакомым, за исключением методов модуля IO::Socket. Давайте тестировать. Сначала, естественно, должен быть запущен C:\TESTS\>sited.pl Теперь, в другом терминале (консольном окне) запускаем клиента: C:\TESTS\>client.pl Если все прошло удачно, то после запуска клиента в терминале с запущеным сервером должно отразиться примерно следущее: Connection from 127.0.0.1:1686... Номер порта может быть другим.
sub GetSockAddr{А цикл while теперь должен выглядеть так: while ($work){Вот таким образом мы получаем исчерпывающую информацию об удаленном компьютере. Но, необходимо заметить, что функция gethostbyaddr не самая быстрая. Для обратного разрешения имени может потребоваться достаточно много времени. Совсем не удивительно если при использовании этой функции вы будете сидеть и ждать когда же ваша программа сделает свое дело. Снова запускаем сервер, а затем и клиента. Connection from thunder.whirlwind.ru (127.0.0.1):1801 Ну вот, господа, мы и закончили с серверными азами. -----------------------------7d42801f240504 Content-Disposition: form-data; name="allow_html_d" yes Автор: Whirlwind |
VSESMI.ru — новости в СМИ.
Tur-Hotel.ru — отзывы об отелях
|
|
Copyright © 2002—2012 ООО "Хостмэйк" Телефон в Москве: +7 (495) 223-46-50 Телефон в Санкт-Петербурге: +7 (812) 448-38-90 Тел./Факс: +7 (8636) 237-836 E-mail: 2006 |