Глобальные сети компьютеров. Практическое введение в Internet

         

Параметры сокета


Перед использованием вы должны задать параметры сокета.

Для этого вы должны подготовить структуру типа sockaddr , определение которой показано ниже:

struct sockaddr { u_short sa_family; char sa_data[14]; }; typedef struct sockaddr SOCKADDR ; typedef struct sockaddr *PSOCKADDR ; typedef struct sockaddr FAR *LPSOCKADDR ;

Для работы с адресами в формате Internet используется другой вариант этой структуры, в котором детализируется формат поля sa_data:

struct sockaddr_in { short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8]; }; typedef struct sockaddr_in SOCKADDR _IN; typedef struct sockaddr_in *PSOCKADDR _IN; typedef struct sockaddr_in FAR *LPSOCKADDR _IN;

Поле sin_family определяет тип адреса. Вы должны записать в это поле значение AF_INET , которое соответствует типу адреса, принятому в Internet:

srv_address.sin_family = AF_INET ;

Поле sin_port определяет номер порта, который будет использоваться для передачи данных.

Порт - это просто идентификатор программы, выполняющей обмен на сети. На одном узле может одновременно работать несколько программ, использующих разные порты.

Особенностью поля sin_port является использование так называемого сетевого формата данных. Этот формат отличается от того, что принят в процессорах с архитектурой Intel, а именно, младшие байты данных хранятся по старшим адресам памяти. Напомним, что архитектура процессоров Intel подразумевает хранение старщих байтов данных по младшим адресам.

Универсальный сетевой формат данных удобен при организации глобальных сетей, так как в узлах такой сети могут использоваться компьютеры с различной архитектурой.

Для выполнения преобразований из обычного формат в сетевой и обратно в интерфейсе Windows Sockets предусмотрен специальный набор функций. В частности, для заполнения поля sin_port нужно использовать функцию htons, выполняющую преобразование 16-разрядных данных из формата Intel в сетевой формат.

Ниже мы показали, как инициализируется поле sin_port в приложении SERVER, описанном далее:


#define SERV_PORT 5000 srv_address.sin_port = htons(SERV_PORT);
Вернемся снова к структуре sockaddr_in .
Поле sin_addr этой структуры представляет собой структуру in_addr:
struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un; }; #define s_addr S_un.S_addr #define s_host S_un.S_un_b.s_b2 #define s_net S_un.S_un_b.s_b1 #define s_imp S_un.S_un_w.s_w2 #define s_impno S_un.S_un_b.s_b4 #define s_lh S_un.S_un_b.s_b3
При инициализации сокета в этой структуре вы должны указать адрес IP, с которым будет работать данный сокет.
Если сокет будет работать с любым адресом (например, вы создаете сервер, который будет доступен из узлов с любым адресом), адрес для сокета можно указать следующим образом:


srv_address.sin_addr .s_addr = INADDR_ANY ;
В том случае, если сокет будет работать с определенным адресом IP (например, вы создаете приложение-клиент, которое будет обращаться к серверу с конкретным адресом IP), в указанную структуру необходимо записать реальный адрес.
Датаграммный протокол UDP позволяет посылать пакеты данных одновременно всем рабочим станциям в широковещательном режиме. Для этого вы должны указать адрес как INADDR_BROADCAST.
Если вам известен адрес в виде четырех десятичных чисел, разделенных точкой (именно так его вводит пользователь), то вы можете заполнить поле адреса при помощи функции inet_addr :
dest_sin.sin_addr .s_addr = inet_addr ("200.200.200.201");
В случае ошибки функция возвращает значение INADDR_NONE , что можно использовать для проверки.
Обратное преобразование адреса IP в текстовую строку можно при необходимости легко выполнить с помощью функции inet_ntoa , имеющей следующий прототип:
char FAR * inet_ntoa (struct in_addr in);
При ошибке эта функция возвращает значение NULL.
Однако чаще всего пользователь работает с доменными именами, используя сервер DNS или файл HOSTS . В этом случае вначале вы должны воспользоваться функцией gethostbyname , возвращающей адрес IP, а затем записать полученный адрес в структуру sin_addr :


PHOSTENT phe; phe = gethostbyname ("ftp.microsoft.com"); if(phe == NULL) { closesocket (srv_socket); MessageBox(NULL, "gethostbyname Error", "Error", MB_OK); return; } memcpy((char FAR *)&(dest_sin.sin_addr ), phe->h_addr , phe->h_length);
В случае ошибки функция gethostbyname возвращает NULL. При этом причину ошибки можно выяснить, проверив код возврата функции WSAGetLastError .
Если же указанный узел найден в базе DNS или в файле HOSTS , функция gethostbyname возвращает указатель на структуру hostent , описанную ниже:
struct hostent { char FAR * h_name; // имя узла char FAR * FAR * h_aliases; // список альтернативных имен short h_addr type; // тип адреса узла short h_length; // длина адреса char FAR * FAR * h_addr _list; // список адресов #define h_addr h_addr_list[0] // адрес }; typedef struct hostent *PHOSTENT ; typedef struct hostent FAR *LPHOSTENT ;
Искомый адрес находится в первом элемента списка h_addr _list[0], на который можно также ссылаться при помощи h_addr. Длина поля адреса находится в поле h_length.

Передача файлов


Строка "FTP - File Transfer from/to a remote site" запускает программу обмена файлами по протоколу FTP (File Transfer Protocol), с помощью которой вы сможете получить файлы из других компьютеров сети Internet или записать на диски этих компьютеров свои файлы.

После выбора этой строки вы будете должны ввести адрес сервера FTP:

Specify the site you want to connect to, for example: Host: glas.apc.org Or, press <enter> to reach the FTP Prompt. Host:

Введите адрес ftp.microsoft.com:

Host: ftp.microsoft.com

Произойдет подключение к серверу FTP фирмы Microsoft, после чего вам будет предложено ввести имя и пароль. Маловероятно, что вы зарегистрированы в этом сервере, однако можно ввести имя anonymous и свой полный почтовый адрес в качестве пароля, который вы получите в представительстве фирмы GlasNet

(символы пароля при вводе не отображаются):

Connected to ftp.microsoft.com. 220 ftp Microsoft FTP Service (Version 1.0). Name (ftp.microsoft.com:frolov): anonymous 331 Anonymous access allowed, send identity (e-mail name) as password. Password: frolov@glas.apc.org

Если вы все сделали правильно, на экране появится приглашение программы FTP:

230-This is FTP.MICROSOFT.COM please read the file index.txt for additional details. 230 Anonymous user logged in as anonymous. Remote system type is Windows_NT. ftp>

Теперь вам доступны файлы, расположенные на сервере FTP фирмы Microsoft, а их очень и очень много!

Введите команду DIR, знакомую вам из операционной системы MS-DOS. На экране отобразится содержимое текущего каталога в формате UNIX :

ftp> dir 200 PORT command successful. 150 Opening ASCII mode data connection for /bin/ls. d--------- 1 owner group 0 Jul 3 1995 bussys d--------- 1 owner group 0 Aug 9 1995 deskapps d--------- 1 owner group 0 Oct 27 1995 developr ---------- 1 owner group 7905 Oct 5 1995 dirmap.htm ---------- 1 owner group 4510 Oct 5 1995 dirmap.txt ---------- 1 owner group 712 Aug 25 1994 disclaimer.txt ---------- 1 owner group 577 Jan 15 18:15 index.txt d--------- 1 owner group 0 Feb 1 18:20 KBHelp ---------- 1 owner group 7209651 Feb 3 12:03 ls-lR.txt ---------- 1 owner group 910713 Feb 3 12:04 ls-lR.Z ---------- 1 owner group 764129 Feb 3 12:03 LS-LR.ZIP d--------- 1 owner group 0 Oct 20 1995 MSCorp d--------- 1 owner group 0 Dec 27 1995 netsr d--------- 1 owner group 0 Oct 11 1995 peropsys d--------- 1 owner group 0 Nov 30 1995 Products d--------- 1 owner group 0 Oct 5 1995 Services d--------- 1 owner group 0 Feb 2 16:02 Softlib ---------- 1 owner group 802 Aug 25 1994 WhatHappened.txt 226 Transfer complete. ftp>

Теперь вы можете получить нужный вам файл при помощи команды GET, указав ей в качестве параметра имя файла. При этом файл будет переписан с удаленного сервера на сервер сети GlasNet. Для того чтобы переписать файл на диск своего компьютера, вам будет нужно ввести команду DOWNLOAD.

Для того чтобы перемещаться по дереву каталогов вы можете воспользоваться командой CD.

После завершения передачи файлов введите команду BYE:

ftp> bye 221 Thank You for using FTP.MICROSOFT.COM Hit <Return> to continue:

Теперь вы можете нажать клавишу <Enter> и вернуться к работе с меню INTERNET SERVICES.


Ранее в этой главе мы рассказывали, как можно получать файлы, переписывая их из серверов FTP в текстовом режиме. В среде операционной системы Microsoft Windows это делать значительно удобнее, пользуясь такими приложениями, как FTP Client for Windows или FTP-32 Client for Windows . Первая из них предназначена для Microsoft Windows версии 3.1 и входит в состав комплекта GlasInterACT. Вторую вы сможете получить из сети Internet, она будет работать в среде Microsoft Windows 95 и Microsoft Windows NT .

Если вы работаете с пакетом программ GlasInterACT, нажмите кнопку FTP, рсположенную в главном окне. Если же вы устанавливаете соединение с сервером в среде Microsoft Windows 95, воспользуйтесь папкой Dial-Up Networking, как это было описано ранее.

В первом случае после установки соединения вы увидите главное окно программы FTP Client for Windows, аналогичное изображенному на рис. 1.10. Во втором случае вам придется запустить программу FTP Client-32 for Windows самостоятельно, пользуясь ее пиктограммой.

Далее вы можете передавать и принимать файлы с использованием удобного интерфейса, похожего на интерфейс программы Norton Commander, как это было описано в разделе "Получение файлов из сети Internet" этой главы. При этом вам не нужно знать никаких команд, имеющих отношение к программе FTP.



Передача и прием данных


После того как канал создан, можно начинать передачу данных. Для передачи данных при помощи протокола гарантированной доставки TCP вы можете воспользоваться функциями send и recv , которые входят в программный интерфейс Windows Sockets.

Функция передачи данных send имеет три параметра - дескриптор сокета sock, на котором выполняется передача, адрес буфера buf, содержащего передаваемое сообщение, размер этого буфера bufsize и флаги flags:

int send (SOCKET sock, const char FAR* buf, int bufsize, int flags);

В нашем приложении CLIENT мы передаем данные серверу следующим образом:

char szBuf[80]; lstrcpy(szBuf, "Test string"); send (srv_socket , szBuf, lstrlen(szBuf), 0);

Параметры функции recv , предназначенной для приема данных, аналогичны параметрам функции send :

int recv (SOCKET sock, char FAR * buf, int bufsize, int flags);

Заметим, что функции recv и send возвращают количество, соответственно, принятых и переданных байт данных. Приложение, которое принимает данные, должно вызывать функцию recv в цикле до тех пор, пока не будут приняты все переданные данные. При этом на один вызов функции send может приходиться несколько вызовов функции recv.

В случае ошибки обе эти функции возвращают значение SOCKET_ERROR . Для анализа причин возникновения ошибки следует воспользоваться функцией WSAGetLastError .

Приведем список кодов ошибок, которые могут возникать при вызове команды send:

Код ошибки Описание
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEACCES Указанный адрес является широковещательным (broadcast), однако перед вызовом функции не был установлен соответствующий флаг
WSAEINTR Работа функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAEFAULT Параметр buf указан неправильно (он не указывает на адресное пространство, принадлежащее приложению)
WSAENETRESET Необходимо сбросить соединение
WSAENOBUFS Возникла блокировка буфера
WSAENOTCONN Сокет не подсоединен
WSAENOTSOCK Указанный в параметре дескриптор не является сокетом
WSAESHUTDOWN Сокет был закрыт функцией shutdown
WSAEWOULDBLOCK Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
WSAEMSGSIZE Был использован сокет типа SOCK_DGRAM

(предназначенный для передачи датаграмм). При этом размер пакета данных превышает максимально допустимый для данной реализации интерфейса Windows Sockets

WSAEINVAL Сокет не был подключен функцией bind
WSAECONNABORTED Сбой из-за слишком большой задержки или по другой причине
WSAECONNRESET Сброс соединения удаленным узлом
<
При выполнении функции recv могут возникать следующие ошибки:

Код ошибки Описание
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAENOTCONN Сокет не подсоединен
WSAEINTR Работа функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAENOTSOCK Указанный в параметре дескриптор не является сокетом
WSAESHUTDOWN Сокет был закрыт функцией shutdown
WSAEWOULDBLOCK Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
WSAEMSGSIZE Размер пакета данных превышает размер буфера, в результате чего принятый пакет был обрезан
WSAEINVAL Сокет не был подключен функцией bind
WSAECONNABORTED Сбой из-за слишком большой задержки или по другой причине
WSAECONNRESET Сброс соединения удаленным узлом
Передача и прием данных в цикле может привести к блокировке работы приложения. Если это неприемлимо, следует воспользоваться асинхронным расширением интерфейса Windows Sockets.

Наше приложение SERVER

демонстрирует асинхронный прием данных.

После установки канала связи оно вызывает функцию WSAAsyncSelect , указывая ей в качестве последнего параметра комбинацию констант FD_READ и FD_CLOSE . При этом функция главного окна приложения будет получать сообщение WSA_NETEVENT в тот момент времени, когда чтение данных не вызовет блокировки приложения:

#define WSA_NETEVENT (WM_USER + 2) rc = WSAAsyncSelect (srv_socket , hWnd, WSA_NETEVENT, FD_READ | FD_CLOSE );

При необходимости выполнения асинхронной посылки данных вы можете указать функции WSAAsyncSelect еще и параметр FD_WRITE .

Если функция WSAAsyncSelect выполнилась успешно, она возвращает нулевое значение, при ошибке - значение SOCKET_ERROR.

В зависимости от значения последнего параметра могут возникать разные коды ошибки, которые можно получить при помощи функции WSAGetLastError. Следующие ошибки могут возникнуть при любом значении параметра:



Код ошибки Описание
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEINVAL Сокет не был подключен функцией bind
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
Дополнительный код ошибки можно получить из параметра lParam при помощи макрокоманды WSAGETSELECTERROR.

При использовании параметра FD_CONNECT возможно появление следующих ошибок:

Код ошибки Описание
WSAEADDRINUSE Указанный адрес уже используется
WSAEADDRNOTAVAIL Указанный адрес не доступен
WSAEAFNOSUPPORT Для данного сокета нельзя использовать указанное семейство адресов
WSAECONNREFUSED Попытка установления канала связи была отвергнута
WSAEDESTADDRREQ Необходимо указать адрес получателя пакета
WSAEFAULT Неправильно указан параметр namelen
WSAEINVAL Сокет уже подключен к адресу
WSAEISCONN Сокет уже подсоединен
WSAEMFILE Больше нет доступных дескрипторов
WSAENETUNREACH Из данного узла и в данное время невозможно получить доступ к сети
WSAENOBUFS Нет места для размещения буфера
WSAENOTCONN Сокет на подключен
WSAENOTSOCK Указан дескриптор файла, а не сокета
WSAETIMEDOUT При попытке установления канала связи возникла задержка во времени
Если используется параметр FD_CLOSE, может возникнуть одна из следующих ошибок:

Код ошибки Описание
WSAENETDOWN Сбой в сети
WSAECONNRESET Сброс соединения удаленным узлом
WSAECONNABORTED Сбой из-за слишком большой задержки или по другой причине
В том случае, когда указаны параметры FD_READ , FD_WRITE , FD_OOB , или FD_ACCEPT , может возникнуть ошибка с кодом WSAENETDOWN .

Обработчик сообщения WSA_NETEVENT должен выполнить анализ причины, по которой он был вызван, так как за один вызов функции WSAAsyncSelect можно задать несколько событий, вызывающих генерацию сообщения. Этот анализ проводится, например, следующим образом:

void WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { char szTemp[256]; int rc;

// Если на сокете выполняется передача данных, // принимаем и отображаем эти данные в виде // текстовой строки if(WSAGETSELECTEVENT(lParam) == FD_READ ) { rc = recv ((SOCKET)wParam, szTemp, 256, 0); if(rc) { szTemp[rc] = '\0'; MessageBox(NULL, szTemp, "Reсeived data", MB_OK); } return; }

// Если соединение завершено, выводми об этом сообщение else if(WSAGETSELECTEVENT(lParam) == FD_CLOSE ) { MessageBox(NULL, "Connection closed", "Server", MB_OK); } }

Отметим, что параметр wParam содержит дескриптор сокета, на котором выполняется передача данных, а параметр lParam - код события, которое произошло в сети.


Передача и прием электронной почты


Для того чтобы работать с электронной почтой в текстовом режиме, вы должны из главного меню диалоговой оболочки GlasNet выбрать строку Electronic Mail:

m -- Electronic Mail

Если ваш почтовый ящик (который физически находится на сервере GlasNet) пуст, вы увидите следующее сообщение и меню:

Folder (incoming) is empty.

Reading folder: incoming...0 messages Type 'u' for next unread message, '?' for command summary, 'h' for more help.

Mail: (i)ndex (u)nread (w)rite (c)apture (d)elete (s)ave (h)elp (q)uit:

Меню Mail, показанное в предыдущей строке, предоставляет вам все необходимые услуги для отправки и получения почты, а также для просмотра содержимого своего почтового ящика и выполнения основных операций с ним.

Для того чтобы продемонстрировать вам простейшие приемы работы с электронной почтой, отправим сами себе маленькое письмо, состоящее из одной строки.

Выберите из меню Mail строку write, для чего вам достаточно после двоеточия ввести символ "w":

Mail:(i)ndex (u)nread (w)rite (c)apture (d)elete (s)ave (h)elp (q)uit:w

После этого программа спросит у вас, желаете ли вы ответить на сообщение, послать новое сообщение или послать копию сообщения:

Do you want: (r)eply reply with (c)opy (n)ew message (s)end copy ? n

Так как мы посылаем новое сообщение, мы вводим символ "n". В ответ нам будет предложено ввести электронный адрес корреспондента:

To: frolov@glas.apc.org

В данном случае мы набрали свой собственный адрес, так как собрались посылать письмо самим себе.

После ввода адреса от вас потребуется придумать краткое описание содержимого письма.

Subject: Test message

Так как ваш корреспондент может получать очень много почты, имеет смысл облегчить для него процесс просмотра писем, указывая в ответ на только что приведенный запрос краткое, но точное описание вашего послания.

Далее вам будет предложено либо набрать текст письма, либо указать путь к заранее подготовленному файлу с письмом:

Hit <RETURN> or <ENTER> to type in a message, or 'u' to (u)pload a file:


Второй способ предпочтительнее, так как вы можете создать файл письма, пользуясь любым привычным для вас текстовым редактором. Соответствующая процедура подробно описана в книге "Руководство пользователя ИКС "ГласСеть".

Мы же отправим очень короткое сообщение, подготовив его текст, не отключаясь от сети. Для этого нажмем клавишу <Enter>.

На экране появится приглашение для ввода текста:

--------------------------------------------------------------------- Begin typing; press <RETURN> at the end of each line. End with a line containing only a period. --------------------------------------------------------------------- Tishis is a test message .

Последняя строка письма должна состоять из одной точки, расположенной в первой позиции. Это признак конца сообщения.

Текст сообщения состоит из одной строки Tishis is a test message (мы специально сделали ошибку в первом слове, чтобы показать вам, как можно редактировать сообщение).

Набрав все строки сообщения и не забыв поставить точку, нажимаем клавишу <Enter>. На экране появится следующее сообщение:

Hit <RETURN> or <ENTER> to send text, 'e' to edit: e

Если нажать клавишу <Enter> еще раз, письмо будет отправлено по назначению. Если же ввести символ "e", у вас будет возможность его отредактировать. При этом на экране появится меню Edit:

Edit:(a)dd (f)ormat (v)iew (r)eview (c)hange (u)pload (s)end (q)uit(?):v

Для просмотра текста сообщения введите символ "v":

-- start of text -- Tishis is a test message -- end of text -- Edit:(a)dd (f)ormat (v)iew (r)eview (c)hange (u)pload (s)end (q)uit(?):c

Теперь нам нужно заменить слово, введенное с ошибкой. Для этого вводим символ "c", в результате чего будет выполнена операция замены. Вам придется ввести ошибочное слово (на этот раз без ошибок!) и правильный вариант:

Enter old pattern: Tishis Enter new pattern: This

This is test message 1 change [Hit <RETURN> or <ENTER> to confirm, 'n' for no change]:



Нельзя сказать, что такой способ редактирования удобен, но других средств редактирования в этом режиме, увы, нет.

Сделав замену, введите в меню Edit еще раз символ "v", чтобы посмотреть результат:

Edit:(a)dd (f)ormat (v)iew (r)eview (c)hange (u)pload (s)end (q)uit(?):v

-- start of text -- This is a test message -- end of text --

Теперь, похоже, ошибок нет и можно отправялть письмо. Выберите из меню Edit строку send, для чего введите символ

"s":

Edit:(a)dd (f)ormat (v)iew (r)eview (c)hange (u)pload (s)end (q)uit(?):s Hit <RETURN> or <ENTER> to send text, 'e' to edit:

Далее нажмите клавишу <Enter>. На экране появится приглашение для ввода электронного адреса, по которому следует отправить копию письма:

Cc:

Так как мы посылаем письмо только себе, в ответ на это приглашение нажмите еще раз клавишу <Enter>. Сообщение будут отправлено адресату:

Message sent. Mail: (i)ndex (u)nread (w)rite (c)apture (d)elete (s)ave (h)elp (q)uit:

Через некоторое время письмо окажется в вашем почтовом ящике, в чем можно убедиться, если из меню Mail выбрать строку index:

Mail:(i)ndex (u)nread (w)rite (c)apture (d)elete (s)ave (h)elp (q)uit:i

Date # Subject Lines From ---- - ------- ----- ---- Mar 2 1* Test message 11 frolov

Из приведенной выше строки видно, что 2 марта было получено письмо, которое хранится в почтовом ящике под номером 1. Символ "*" около номера письма указывает, что письмо еще не прочитано (так и есть на самом деле).

В столбце Subject отображается краткое содержимое письма. Если в ящике лежит много писем, то вы легко сможете найти нужное, пользуясь этим столбцом.

Столбец Lines позволит вам оценить размер письма. Обратите внимание, что хотя мы посылали сообщение, состоящее только из одной строки, в полученном письме этих строк стало 11. Дело в том, что к письму был добавлен заголовок, который вы скоро увидите.

И, наконец, в поле From стоит адрес отправителя пиьма.

Теперь давайте попробуем переписать полученное письмо из почтового ящика, расположенного на сервере GlasNet, к себе на локальный диск. Для этого из меню Mail выберите строку capture:



Mail:(i)ndex (u)nread (w)rite (c)apture (d)elete (s)ave (h)elp (q)uit:c

В ответ на следующие вопросы введите символ "d" и укажите номер загружаемого письма, под которым оно хранится в почтовом ящике:

Do you want to (d)ownload message or switch (p)aging On/Off? d Enter message number: 1

Далее вы узнаете, что письмо содержит 309 байт 7-битового текста. Вам будет нужно выбрать протокол передачи данных для загрузки письма. Выберем протокол zmodem:

Found plain 7-bits text for download. 309 bytes to download. Protocol: (a)scii-text (k)ermit (x)modem (y)modem (z)modem (f)tp (? for help): z

В ответ на следующее приглашение введите имя файла, в который будет записан текст письма и нажмите клавишу <Enter>:

Enter filename to store message in: testmsg.txt

Если вы выбрали протокол передачи данных zmodem, автоматически начнется передача данных. После ее завершения вам следует нажать клавишу <Enter>:

Please instruct YOUR modem software to RECEIVE using zmodem soon. Hit <RETURN> or <ENTER> when done.

После того, как письмо будет переписано на диск вашего компьютера, выберите еще раз в меню Mail строку index:

Mail:(i)ndex (u)nread (w)rite (c)apture (d)elete (s)ave (h)elp (q)uit:i

Date # Subject Lines From ---- - ------- ----- ---- Mar 2 1 Test message 11 frolov

Как видите, теперь символ "*"

около номера письма исчез, так как мы только что прочитали письмо и оно уже не является новым.

Теперь вы можете удалить письмо из почтового ящика. Для этого следует выбрать из меню Mail строку delete и в ответ на дополнительный запрос указать номер удаляемого письма:

Mail:(i)ndex (u)nread (w)rite (c)apture (d)elete (s)ave (h)elp (q)uit:d Enter message number: 1 Message deleted. (Type 'und' and <RETURN> NOW to restore all deletions.)

Не пренебрегайте этой процедурой, так как за хранение большого объема корреспонденции в почтовом ящике с вас будет браться дополнительная плата.

Теперь давайте взглянем на полученное письмо:

From frolov Sat Mar 2 11:07:49 1996 Received: by glas.apc.org (Smail3.1.29.1 #13) id m0tsmM1-0003zTN; Sat, 2 Mar 96 11:07 +0300 Message-Id: <m0tsmM1-0003zTN@glas.apc.org> Date: Sat, 2 Mar 96 11:07 +0300 From: frolov (Alexander V. Frolov) To: frolov@glas.apc.org Subject: Test message



This is a test message

Как видите, размер заголовка значительно превышает размер самого письма. Некоторые строки заголовка были кратко описаны в разделе "Электронная почта", расположенного в начале этой главы.

Следует заметить, что если вы обратились для подключения к сети Internet в другую организацию (например, в Relcom ), сценарий работы с электронной почтой в текстовом режиме может сильно отличаться от только что описанного. В частности, Релком предоставит в ваше распоряжение программу, которая будет автоматически соединяться с почтовым сервером, получать новую почту и передавать почту, подготовленную вами заранее к отправке. После этого связь с сервером будет автоматически разъединена. Этот режим работы намного удобнее, однако если вы можете позволить себе установить на свой компьютер операционную систему Microsoft Windows, то вам будет доступна еще более удобная программа Eudora, которую мы опишем в нашей книге.

Когда вы подключаетесь с помощью терминальной программы к серверу GlasNet, для вас запускается специальная диалоговая оболочка, с помощью которой вы и получаете доступ к Internet. Другие организации могут предоставить вам доступ к удаленной консоли сервера, работающего под управлением операционной системы UNIX . Если вас не пугает перспектива работать с командным приглашением этой операционной системы, такой режим может показаться удобнее. Соответствующие средства достаточно хорошо описаны в литературе, список которой приведен в конце нашей книги.


Переход к следующей строке


Бывают случаи, когда вам необходимо сделать переход к другой строке, оставаясь при этом в рамках текущего параграфа. Такая возможность имеется во всех текстовых процессорах.

При подготовке документа HTML вы можете сделать принудительный переход к другой строке с помощью команды <BR>, например:

<P> Простейшие текстовые редакторы, такие как:<BR> Notepad, <BR> Norton Editor,<BR> Лексикон для DOS, <BR> предполагают, что текст состоит из отдельных строк, каждая из которых завершается специальным символом - символом конца строки.

При отображении этот текст будет выглядеть следующим образом:

Простейшие текстовые редакторы, такие как: Notepad, Norton Editor, Лексикон для DOS, предполагают, что текст состоит из отдельных строк, каждая из которых завершается специальным символом - символом конца строки.

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



PING


Программа PING возникла в мире UNIX. Сейчас она входит в состав операционных систем Microsoft Windows 95 (при установленном расширении Microsoft Plus)

и Microsoft Windows NT. С помощью этой программы вы сможете проверить, доходят ли пакеты данных протокола TCP/IP до любого узла Internet, адрес которого вы знаете.

Сделать это очень просто - достаточно указать программе PING при запуске в виде параметра адрес или доменное имя узла, например:

c:\>ping 254.123.45.6

или

c:\>ping some.node.com

Запуск программы PING в среде операционных систем Microsoft Windows 95 и Microsoft Windows NT необходимо выполнять из командного приглашения. В первом случае это должно быть командное приглашение сеанса MS-DOS, запущенного в середе Microsoft Windows 95, во втором - командное приглашение Microsoft Windows NT.

После запуска программа PING сделает четыре попытки передачи указанному узлу диагностического эхо-пакета и отобразит на экране результат:

Pinging some.node.com [254.123.45.6] with 32 bytes of data:

Reply from 254.123.45.6: bytes=32 time=110ms TTL=32 Reply from 254.123.45.6: bytes=32 time=80ms TTL=32 Reply from 254.123.45.6: bytes=32 time=110ms TTL=32 Reply from 254.123.45.6: bytes=32 time=110ms TTL=32

По умолчанию между передачами пакетов выдерживается интервал в одну секунду.

Если указанный узел недоступен или не существует в сети, вы увидите следующее сообщение:

C:\>ping 200.200.200.100 Pinging 200.200.200.100 with 32 bytes of data:

Request timed out. Request timed out. Request timed out. Request timed out.

В этом случае вы должны проверить, правильно ли вы указали адрес. Если в качестве параметра программе PING было указано доменное имя, то следует проверить настройку сервиса DNS (в первую очередь следует проверить адрес сервера DNS).

Для проверки настройки сетевой компоненты TCP/IP нужно указать программе PING адрес 127.0.0.1 или локальное доменное имя localhost, которое отображается на указанный адрес в файле HOSTS в операционной системе Microsoft Windows 95.



PM Ping


Приложение PM Ping предназначено для решения той же задачи, что и только что описанная программа PING , однако она работает под управлением операционной системы OS/2 Warp.

Для запуска этой программы откройте папку OS/2 System и сделайте двойной щелчок левой клавишей мыши по пиктограмме TCP/IP. В результате откроется папка с одноименным названием, содержимое которой показано на рис. 3.1.

Рис. 3.1. Содержимое папки TCP/IP

В этой папке есть уже знакомые вам пиктограммы, о которых мы рассказывали в предыдущей главе. Обращаем ваше внимание на книгу Introduction to TCP/IP и приложение TCP/IP Configuration , которые помогут вам настроить протокол TCP/IP.

Сейчас нас интересует папка TCP/IP Utilities , в которой находится программа PM Ping и другие программы (рис. 3.2).

Рис. 3.2. Папка TCP/IP Utilities

Установив соединение с сервером поставщика услуг Internet (как это было описано в предыдущей главе), запустите приложение PM Ping, сделав двойной щелчок левой клавишей мыши по ее пиктограмме. На экране появится главное окно приложения, показанное на рис. 3.3.

Рис. 3.3. Главное окно приложения PM Ping

Вначале в этом окне есть только пиктограмма и строка Result Displayed. Для того чтобы приступить к проверке соединения, необходимо выбрать из меню Settings строку Hosts. В результате на экране появится диалоговая панель PM Ping Host Editor (рис. 3.4), в которой отображаются адреса проверяемых узлов. Заметим, что можно одновременно контролировать соединение с несколькими узлами.

Рис. 3.4. Диалоговая панель PM Ping Host Editor

Первоначально список Hosts в диалоговой панели PM Ping Host Editor пуст. Для добавления в него адреса проверяемого узла нажмите кнопку Add. В появившейся после этого диалоговой панели Add a Host (рис. 3.5) укажите адрес узла и произвольный текстовый комментарий. Адрес можно задавать только в виде четырех десятичных цифр, разделенных точками, что неудобно, если вам известно только доменное имя узла.

Рис. 3.5. Добавление адреса узла к списку проверяемых узлов

После добавления адреса узла в главном окне приложения PM Ping появляется соответствующая строка, в которой отображается время ответа на диагностический пакет.

С помощью меню Interval вы можете задать интервал посылки диагностических пакетов в пределах от одной секунды до пяти минут.

Если по какой-либо причине соединение с одним из проверяемых узлов разрывается, в окне приложения PM Ping напротив адреса и комментария появляется сообщение об ошибке (рис. 3.6).

Рис. 3.6. Сообщение об ошибке, которое появилось после того как мы завершили работу IBM Internet Connection



Подключение к серверу


Запустите любую терминальную программу и позвоните с ее помощью по одному из телефонов, полученных вами в фирме GlasNet. О том, как работать с терминальными программами, вы можете узнать из 16 тома "Библиотеки системного программиста", который называется "Модемы и факс-модемы".

Через некоторое время на экране терминальной программы появится приглашение следующего вида:

[this dialin modem is ZyXEL U-1496E 16.8] GlasNet (glas.apc.org) Need Help? +7-095 ХХХ-ХХХХ login:

В ответ вы должны ввести свой идентификатор, зарегистрированный в представительстве GlasNet, например:

login: ivanov

После этого у вас будет запрошен пароль:

Password:

При вводе символы пароля не отображаются.

Если пароль введен правильно, на экране появится запрос для ввода типа терминала, который эмулирует ваша терминальная программа:

Last login: Sat Feb 3 23:22:10 from T-kv01-1+ Terminal = vt100 (hit <RETURN> or enter new terminal type):

Если ваш терминал соответствует стандарту VT100, просто нажмите клавишу <Enter>. Вслед за этим вы попадете в главное меню программы, предоставляющей доступ ко всем услугам глобальной сети Internet:

Welcome to GlasNet. For help, type "?" You have new conf entries in glas.netnews.e glas.netnews.r ... GlasNet Commands: c -- Conferences m -- Electronic Mail i -- Internet Services d -- Online Databases u -- User Directory p -- Payments s -- Setup: Change your password, language, terminal type e -- Extras bye -- Logout Your selection (? or 'h' for help):

Когда вы подключаетесь к сети GlasNet в первый раз (а также в процессе дальнейшей работы), то можете выбрать для общения с вами русский, английский, немецкий, французский, португальский или испанский язык. Подробнее об этом написано в книге "Руководство пользователя ИКС ГласСеть", которая выдается вам бесплатно при подключении к сети.

В приглашении "Your selection (? or 'h' for help):" вы должны ввести одну из команд сети GlasNet, перечисленных в меню.


Ниже мы привели список команд с кратким описанием.

Команда Описание
I Работа в сети Internet
m Работа с электронной почтой
c Работа с телеконференциями
d Доступ к текстовым базам данных
u Просмотр списков пользователей
p Просмотр состояния счета
s Настройка параметров
e Дополнительные возможности
bye Завершение работы в сети GlasNet
Сейчас для нас наибольший интерес представляют возможности работы в сети Internet и средства для работы с электронной почтой (команды i и m).

Если выбрать из меню команд строку "i -- Internet Services", на экране появится меню, с помощью которого можно выбрать один из нескольких режимов работы в сети Internet:

---------------------------------------------------------------- I N T E R N E T S E R V I C E S ---------------------------------------------------------------- [1] Gopher - Hypermenu Hierarchical System [2] Lynx - Text based WWW browser [3] Telnet - Terminal Access to a remote host [4] FTP - File Transfer from/to a remote site [5] SWAIS - Full Screen Database Browser

Select a number (? for help, or q to quit):

С помощью этого меню вы сможете использовать все основные режимы работы в сети Internet.

Система иерархических меню Gopher предоставляет доступ к ресурсам Internet и грандиозным запасам текстовой информации, расбросанной по всему миру. Она проста в использовании, но сейчас большую популярность приобретает система серверов World Wide Web (WWW), доступ к которой в текстовом режиме вы можете получить с помощью второй строки (программа Lynx ).


Подключение к серверу FTP


Для подключения к удаленному серверу FTP введите команду open, указав ей в качестве параметра имя сервера или его адрес IP. В ответ на эту команду удаленный серевер предложит вам ввести имя пользователя и пароль. Как правило, вы всегда должны указывать имя anonymous и свой электронный почтовый адрес в качестве пароля.

В любой момент времени после установки соединения с сервером FTP вы можете ввести имя пользователя при помощи команды user.



Подключение к сети


Как мы только что сказали, для использования современных графических средств доступа к Internet вам необходимо установить с этой сетью прямое соединение с использованием протокола TCP/IP.

Этот протокол является стандартным для операционных систем Microsoft Windows 95 и Microsoft Windows NT , поэтому указанное выше соединение выполняется в этих случаях без особых проблем. В первом случае вы можете воспользоваться системой Dial-Up Networking, подключаемой на этапе установки сетевых средств Microsoft Windows 95, во втором - системой Remote Access Service, которая входит в состав Microsoft Windows NT.

Если же вы работаете в среде Microsoft Windows версии 3.1 или Microsoft Windows for Workgroups , средства TCP/IP могут быть установлены дополнительно. Есть такие средства и для операционной системы IBM OS/2 Warp .

В представительстве фирмы GlasNet вы можете приобрести набор приложений GlasInterACT , предназначенных для работы в сети Internet, объединенных общей запускающей программой (рис. 1.18). Этот набор работоспособен в среде Microsoft Windows версии 3.1, Microsoft Windows for Workgroups, а также Microsoft Windows 95.

Рис. 1.18. Набор приложений GlasInterACT, предназначенных для работы в сети Internet

В главном окне приложения GlasInterACT

имеются кнопки, предназначенные для работы с электронной почтой, конференциями, для просмотра содержимого серверов Gopher , для передачи файлов с использованием протокола FTP и для работы с уадаленной консолью компьютеров при помощи протокола TELNET .

Если нажать любую из перечисленных кнопок, кроме кнопки Mail, предназначенной для работы с электронной почтой, запустится система Trumpet Winsock, которая представляет собой реализацию протокола TCP/IP для операционной системы Microsoft Windows версии 3.1. Перед запуском у вас будет запрошены имя пользователя и пароль (рис. 1.19).

Рис. 1.19. Запрос имени пользователя и пароля при подключении к сети

Далее система будет автоматически дозваниваться до серверов GlasNet, пользуясь заранее подготовленным списком телефонов (рис. 1.20).




Рис. 1.20. Автоматическое соединение с серверами GlasNet

Как только связь будет установлена, запустится одно из приложений (в зависимости от того, какую кнопку вы нажали в главном окне приложения GlasInterACT.

В течении всего времени вашего подключения к сети на экране будет находится окно, в котором отображается время подключения (рис. 1.21). Время подключения - это то, за что в GlasNet вы платите деньги, поэтому следите за ним.



Рис. 1.21. В отдельном окне отображается время подключения к сети

Как видите, процесс подключения к сети очень прост - достаточно нажать на кнопку и ввести самые необходимые данные, такие как имя пользователя и пароль.

Для того чтобы подключиться к Internet, находясь в среде Microsoft Windows 95, достаточно после соответствующей настройки сетевых средств сделать двойной щелчок левой клавишей мыши по соответствующей пиктогрммме в папке Dial-Up Networking (рис. 1.22).



Рис. 1.22. Папка Dial-Up Networking

(телефонные номера приведены только для примера)

После этого на экране появится диалоговая панель Connect To, в которой можно указать имя пользователя, пароль, а также (при необходимости) изменить номер телефона и другие характеристики (рис. 1.23).



Рис. 1.23. Диалоговая панель Connect To

При соответствующей настройке соединение будет выполнено автоматически. При необходимости можно установить такую настройку, при которой до установления соединения или сразу после установления соединения на экране появится окно терминальной программы (рис. 1.24).



Рис. 1.24. Окно терминальной программы, которое появляется после установления соединения

Когда соединение установлено, на экране появляется диалоговая панель Connected to…, где отображается скорость передачи данных, время подключения к сети и другие параметры (рис. 1.25).



Рис. 1.25. Диалоговая панель, в которой отображаются параметры соединения

Теперь, после того как соединение с Internet установлено, вы можете запускать сетевые приложения и работать с Internet - принимать и отправлять почту, загружать на диск своего компьютера файлы, пользуясь протоколом FTP, работать с серверами WWW, удаленной консолью компьютеров и электронными конференциями.


ПОДКЛЮЧЕНИЕ К СЕТИ INTERNET


В этой главе мы научим вас подключать свой компьютер к глобальной и локальной сети с использованием протокола TCP/IP. Вы узнаете о системе адресов, принятой в сетях с указанным протоколом, и научитесь правильно настраивать сетевые компоненты основных операционных систем Microsoft Windows 95, Microsoft Windows NT и IBM OS/2. Такая настройка является наиболее тонким моментом в создании глобальных и локальных сетей, работающих с протоколом TCP/IP.



Подключение протокола TCP/IP


Прежде всего вы должны убедиться, что на вашей рабочей станции установлен протокол TCP/IP.

Для этого запустите приложение Control Panel и сделайте двойной щелчок левой клавишей мыши по пиктограмме Network. На экране появится диалоговая панель Network Settings, показанная на рис. 2.33.

Рис. 2.33. Диалоговая панель Network Settings

Просмотрев список Installed Network Software, убедитесь, что в нем имеется строка TCP/IP Protocol. Если этой строки нет, нажмите кнопку Add Software. На экране появится диалоговая панель со списком названий различных программных компонент. Выберите из этого списка строку TCP/IP Protocol and related components.

На экране появится диалоговая панель Windows NT TCP/IP Installation Options, показанная на рис. 2.34.

Рис. 2.34. Диалоговая панель Windows NT TCP/IP Installation Options

Набор переключателей Components позволяет выбрать программные компоненты, имеющие отношение к протоколу TCP/IP. Включите переключатели Connectivity Utilities и нажмите кнопку Continue. Остальные компоненты при необходимости можно будет добавить позже.

После установки протокола TCP/IP выберите его в списке Installed Network Software и нажмите кнопку Configure. Вы увидите диалоговую панель TCP/IP Configuration (рис. 2.35).

Рис. 2.35. Диалоговая панель TCP/IP Configuration

Хотя это может показаться странным, при использовании системы Remote Access Service вы не должны заполнять поля диалоговой панели TCP/IP Configuration. Дело в том, что такие параметры, как IP Adress и маска подсети будут задаваться при настройке системы Remote Access Service. Процесс настройки мы опишем чуть позже.

А сейчас нажмите кнопку DNS, расположенную на этой диалоговой панели. На экране появится диалоговая панель DNS Configuration, предназначенная, как это видно из названия, для настройки конфигурации сервиса доменных имен DNS (рис. 2.36).

Рис. 2.36. Диалоговая панель DNS Configuration, с помощью которой выполняется настройка конфигурации сервиса доменных имен DNS

В этой панели вы должны указать имя вашего узла (поле Host Name) и имя домена, к которому относится ваш узел (поле Domain Name). Например, если вы подключены к домену сети GlasNet, вы должны указать в этом поле имя glas.apc.org.



Подключение в среде OS/2 Warp Connection


Операционные системы IBM OS/2 Warp версии 3.0 и IBM OS/2 Warp Connect также могут быть с успехом использованы для работы в глобальной сети Internet. Для того чтобы установить соединение в среде IBM OS/2 Warp версии 3.0, вы должны дополнительно установить набор приложений IBM Intenet Connection , который входит в состав пакета BonusPack .

Что же касается операционной системы IBM OS/2 Warp Connect, то в нее уже входит набор приложений, предназначенных для работы с Internet. В этом разделе мы рассмотрим процедуру подключения к Internet именно для этой операционной системы.



При разработке операционной системы Microsoft


При разработке операционной системы Microsoft Windows 95 в нее изначально были заложены средства для работы с протоколом TCP/IP, сетью Microsoft Network (MSN ) и сетью Internet. Сеть MSN, на наш взгляд, пока еще не пользуется популярностью в России, поэтому мы сосредоточимся на методах подключения к серверам других поставщиков услуг Internet. В качестве примера мы будем пользоваться ресурсами сети GlasNet. При необходимости пользуясь нашими рекомендациями вы сможете самостоятельно настроить сетевые средства Microsoft Windows 95 для работы с сетями другими поставщиков услуг Internet.

Итак, приступим.

При настройке мы будем исходить из того, что в процессе установки операционной системы Microsoft Windows 95 вы указали, что вам необходима поддержка протокола TCP/IP. Кроме того, вы должны установить адаптер Dial-Up Nertworking (т. е. модем). Все это можно сделать, пользуясь стандартной процедурой установки Microsoft Windows 95.

Чтобы проверить установку протокола TCP/IP, откройте папку Control Panel и сделайте двойной щелчок мышью по пиктограмме Network. В списке The following network components are installed помимо других должны быть следующие строки:

Clients for Microsoft networks Dial-Up Adapter TCP/IP -> Dial-Up Adapter

Если какой-либо из перечисленных выше строк нет в списке, нажмите кнопку Add. На экране появится диалоговая панель Select Network Component Type. С помощью этой диалоговой панели вы можете добавить программное обеспечение клиента (строка Client), сетевой адаптер (строка Adapter), протокол передачи данных (Protocol) или сервис (строка Service).

Если у вас не установлен протокол TCP/IP, выдерите в указанном списке строку Protocol и нажмите кнопку Add. В списке, расположенном в левой части появившейся диалоговой панели Select Network Protocol выберите строку Microsoft. Затем в списке Network Protocols выберите строку TCP/IP и нажмите кнопку OK. После этого в списке The following network components are installed

появится строка TCP/IP.

Теперь откройте папку Control Panel, которая находится в папке My Computer, и затем раскройте папку Dial-Up Networking. Содержимое этой папки, в которой уже было определено несколько соединений, показано на рис. 2.8.





Рис. 2.8. Содержимое папки Dial-Up Networking ( телефонные номера приведены только для примера)

Сразу после установки Microsoft Windows 95 в папке Dial-Up Networking имеется только одна пиктограмма Make New Connection, с помощью которой вы можете определить новое соединение. Сделайте по этой пиктограмме двойной щелчок левой клавишей мыши.

После этого запустится программа полуавтоматической настройки параметров соединения, первая диалоговая панель которой показана на рис. 2.9.



Рис. 2.9. Первая диалоговая панель программы полуавтоматической настройки параметров соединения

В поле Type a name for the computer you are dialing вы должны написать название компьютера, с которым будет устанавливаться соединение. Вы можете выбрать любое название, которое вам нравится.

Далее в поле Select a modem необходимо выбрать модем. Обычно в компьютере установлен только один модем, поэтому можете сразу нажимать кнопку Configure для настройки параметров модема.

На экране появится блокнот настройки параметров модема, который содержит три страницы (рис. 2.10).



Рис. 2.10. Блокнот настройки параметров модема

В меню Port страницы General

указан порт, к которому подключен модем. Этот порт выбирается автоматически при установке операционной сиситемы, поэтому вам его можно не изменять.

С помощью регулятора Speaker volume вы можете отрегулировать громкость динамика, встроенного в модем. Такая возможность имеет значение, если вы любите работать по ночам.

Однако наиболее важный параметр, который настраивается с помощью страницы General, - это максимальная скорость, с которой будет работать порт последовательной передачи данных, через который подключен модем. Современные высокоскоростные модемы не станут работать правильно, если вы укажите скорость менее 115200 bps. Нужное значение вы можете узнать из документации, которая поставляется вместе с модемом.

Теперь перейдем к странице Connection

(рис. 2.11), сделав по ее закладке щелчок левой клавишей мыши.



Рис. 2.11. Страница Connection



блокнота настройки параметров модема

Параметры, указанные в полях Connection preferences и Call preferences можно оставить без изменения.

Для настройки параметров порта последовательной передачи данных нажмите кнопку Port Settings. На экране появится диалоговая панель Advanced Port Settings, показанная на рис. 2.12.



Рис. 2.12. Диалоговая панель Advanced Port Settings

Современные порты последовательной передачи данных оборудованы встроенным буфером FIFO, поэтому если вы располагаете таким портом, имеет смысл включить переключатель Use FIFO buffers. Дополнительно с помощью двух регуляторов, расположенных в этом окне, вы можете изменять размер буферов приема (верхний регулятор) и передачи (нижний регулятор).

Настрив параметры порта, нажмите кнопку OK и вернитесь к странице Connection

блокнота настройки параметров модема. Нажмите кнопку Advanced, расположенную на этой панели и приступайте к настройке параметров соединения (рис. 2.13).



Рис. 2.13. Диалоговая панель настройки параметров соединения Advanced Connection Settings

Убедитесь, что включен переключатель Use error control. Это необходимо для использования средств контроля за ошибками при передаче данных. Дополнительно включите переключатель Required to connect. В результате для установки соединения наличие такого контроля будет необходимым.

Кроме того, в группе переключателей Use flow control включите переключатлеь Hardware (RTS/CTS). Аппаратные средства управления передачей данных работают надежнее программных.

Теперь переключитесь на страницу Options, показанную на рис. 2.14.



Рис. 2.14. Страница Options блокнота настройки параметров модема

В группе переключателей Connection control включите переключатель Bring up terminal window after dialing, а переключатель Bring up terminal window before dialing наоборот, выключите. В результате сразу после установки соединения на экране появится окно терминальной программы, с помощью которого вы первое время будете вводить свой идентификатор и пароль. В дальнейшем мы научим вас создавать специальный командный файл, при использовании которого эти параметры будут передаваться удаленному узлу автоматически.



Теперь нажмите кнопку OK. Вы вернетесь в диалоговую панель, показанную на рис. 2.9. В ней нужно нажать кнопку Next.

После этого на экране появится следующая диалоговая панель программы программы полуавтоматической настройки параметров соединения (рис. 2.15).



Рис. 2.15. Вторая диалоговая панель программы программы полуавтоматической настройки параметров соединения (телефонный номер приведен только для примера)

В этой панели вы должны указать код города, в котором расположен узел организации, предоставляющей сервис Internet (поле Area code), код страны (поле Country code) и телефонный номер для соединения (поле Telephone number). Заполнив эти поля, нажмите кнопку Next.

В результате на экране появится последняя диалоговая панель программы полуавтоматической настройки параметров соединения (рис. 2.16).



Рис. 2.16. Последняя диалоговая панель программы программы полуавтоматической настройки параметров соединения

В единственном поле, расположенном на этой диалоговой панели, вы можете отредактировать название пиктограммы, которая будет соответствовать только что созданному вами соединению. Кроме того, вы можете с помощью кнопки Back повторить предыдущие этапы настройки.

Если все было указано правильно, нажмите кнопку Finish. В результате создание соединения будет закончено и в окне DialUp Networking появится новая пиктограмма.

Однако пока мы не будем торопиться пробовать, как работает новое соединение, так как процесс настройки еще не закончен.

Сделайте щелчок правой клавишей мыши по только что созданной пиктограмме в окне DialUp Networking и выберите из контекстного меню строку Properties (рис. 2.17).



Рис. 2.17. Продолжение настройки параметров соединения при помощи контекстного меню

После выбора этой строки на экране появится блокнот, состоящий из единственной страницы с названием General (рис. 2.18). Если вы делаете локальный звонок (по номеру, расположенному в вашем городе), то переключатель Use country code and area code можно выключить.



Рис. 2.18. Страница General, с помощью которой можно настроить параметры созданного соединения



Нажмите кнопку Server Type, которая расположена на этой странице. На экране появится одноименная диалоговая панель (рис. 2.19).



Рис. 2.19. Диалоговая панель Server Type

Установите переключатели так, как это показано на рис. 2.19. Из всех протоколов, перечисленных в группе переключателей Allowed network protocols,

выберите только TCP/IP.

Теперь вы должны настроить драйвер TCP/IP, указав необходимые адреса, полученные в организации, подключившей вас к Internet. Для этого нажмите кнопку TCP/IP Settings. На экране появится диалоговая панель с таким же названием (рис. 2.20).



Рис. 2.20. Диалоговая панель TCP/IP Settings

Если вы - владелец собственного адреса IP, укажите его в поле IP address, включив предварительно переключатель Specify an IP address. Если же адрес IP выдается вам только на время сеанса связи (что скорее всего), включите переключатель Server assigned IP address.

Далее в полях Primary DNS (основной сервер DNS) и Secondary DNS (резевный сервер DNS, который будет использован при недоступности основного сервера) укажите адреса узлов, на которых расположена база данных доменных имен DNS. Если вы подключены к сети GlasNet, можете воспользоваться значениями, указанными на рис. 2.20. В противном случае узнайте эти адреса в организации, подключившей вас к Internet.

Далее включите переключатели Use IP header compression и Use default gateway on remote network. При этом для вас мостом в сеть Internet будет служить узел, к которому вы подключаетесь через данное соединение. Заметьте, что адрес моста вам указывать не нужно.

Все! Теперь можно пробовать.

Сделайте двойной щелчок левой клавишей мыши по пиктограмме созданного и настроенного соединения. На экране появится диалоговая панель Connect To, показанная на рис. 2.21.



Рис. 2.21. Диалоговая панель Connect To

Теперь вы можете нажимать на кнопку Connect и после этого начнется процесс установки соединения. Однако перед этим давайте нажмем кнопку Dial Properties и посмотрим, какие параметры можно изменить в последнюю минуту перед установкой соединения (рис. 2.22).





Рис. 2.22. Диалоговая панель Dialing Properties

Наиболее интересен параметр The phone system at this location uses, с помощью которого вы можете выбрать либо тональный набор номера (Tone Dialing), либо импульсный (Pulse dialing). Последний способ набора номера наиболее распространен в России.

Если ваша операционная система установлена на портативном компьютере, и вы работаете с сетью Internet из разных мест, воспользуйтесь группой органов управления Where I am. С помощью этой группы вы сможете создать несколько комбинаций кода страны и города.

Итак, считаем, что настраивать уже больше нечего. Нажимаем кнопку Connect в диалоговой панели Connect To (рис. 2.21) и через некоторое время слышим, как модем начинает набирать номер. На экране при этом появляется диалоговая панель, показанная на рис. 2.23.



Рис. 2.23. Диалоговая панель Connecting to GlasNet

Если вам не повезло, линия может оказаться занятой. Вас проинформируют об этом с помощью сообщения, показанного на рис. 2.24.



Рис. 2.24. Сообщение о том, что телефонная линия занята

Вы, конечно, можете позвонить позже, однако лучше настроить систему Dial-Up Networking так, чтобы дозвон выполнялся автоматически.

Это можно сделать, если выбрать из меню Connections папки Dial-Up Networking

строку Settings и в появившемся на экране одностраничном блокноте (рис. 2.25) включить переключатель Redial.



Рис. 2.25. Настройка параметров автоматического дозвона

При помощи органа управления Before giving up retry вы можете указать, сколько раз система должна пытаться звонить, прежде чем сообщать вам о невозможности установления соединения. Органы управления Between tries wait дают вам возможность задать продолжительность паузы, которая будет выдерживаться между очередными попытками установки соединения.

В случае удачного соединения на экране появится окно терминальной программы (так как на странице Options блокнота настройки параметров модема (рис. 2.14) был включен переключатель Bring up terminal window after dialing). Это окно показано на рис. 2.26 (мы подключились к узлу GlasNet).





Рис. 2.26. Окно терминальной программы, которое появилось после установки соединения

Для того чтобы установить соединение с узлом GlasNet и использовать при этом протокол PPP, после своего идентификатора мы указали строку ppp. Далее мы ввели пароль и нажали клавишу <Enter>.

Через некоторое время на экране должен появится нечитаемый набор символов. Это признак того, что система приступила к установке соединения с использованием протокола PPP. Вы должны нажать кнопку Continue в окне терминальной программы или функциональную клавишу <F7> на клавиатуре.

Далее начнется процедура проверки имени пользователя и пароля (рис. 2.27).



Рис.2.27. Сообщение о начале процедуры проверки имени пользователя и его пароля

Удаленный узел проверит пароль, и если вы указали его неправильно, отключит вас от сети, отобразив на экране сообщение, показанное на рис. 2.28.



Рис. 2.28. Сообщение об отключении от сети

Если вы увидели такое сообщение, следует повторить попытку соединения.

При успешном соединении вы увидите верхнюю часть диалоговой панели, показанную на рис. 2.29 (для просмотра всей панели нажмите кнопку Details).



Рис. 2.29. Диалоговая панель, которая появляется при успешном соединении

В этой панели отображается скорость передачи данных и продолжительность соединения. В любое время вы можете разорвать соединение, нажав кнопку Disconnect.

Теперь, когда вы научились устанавливать соединение, переходите к следующей главе и работайте с описанными в ней приложениями Internet.


Подключение в среде Windows NT


Операционная система Microsoft Windows NT , и в частности, ее вариант для рабочих станций Microsoft Windows NT Workstation версии 3.51, получает все большую популярность. Это связано, по нашему мнению, в первую очередь с высокой надежностью этой операционной системы, ее отличными сетевыми средствами, совместимостью с приложениями, разработанными для Microsoft Windows версии 3.1 и Microsoft Windows 95. Другой причиной является широкое распространение относительно недорогих рабочих станций на базе процессора Pentium и объемом оперативной памяти 16 и более Мбайт .

Благодаря развитой поддержке протоколов TCP/IP и PPP, а также наличию многочисленных сетевых приложений, операционная система Microsoft Windows NT широко используется в сети Internet в качестве серверов WWW, FTP и т. п. Мощные рабочие станции на ее основе легко подключаются к сети в качестве оконечных узлов.

В этой главе мы научим вас подключать рабочую станцию Microsoft Windows NT Workstation версии 3.51 к сети Internet через протокол PPP. Для демонстрации мы будем подключаться, как и в предыдущей главе, к серверу сети GlasNet.

В качестве средства для доступа к Internet мы будем использовать систему Remote Access Service, которая входит в комплект операционной системы Microsoft Windows NT.



Получение файлов


Основная команда, которой вы будете пользоваться для переписывания файлов с дисков удаленного узла на диски локального компьютера, это команда get. В качестве параметра ей необходимо указать имя нужного вам файла.

Если вам нужно одновременно получить все или несколько файлов из текущего каталога удаленного узла, воспользуйтесь командой mget, указав ей в качестве параметра шаблон имени файла (аналогичный тому, что используется в MS-DOS).



Получение файлов из сети Internet


Как программиста или системного администратора, вас не оставит равнодушным возможность получить через сеть Internet новую версию драйвера для периферийного устройства компьютера, исходные тексты приложений Windows, составленные программистами Microsoft, IBM или Borland, последние версии самых разнообразных программ, документацию и многое другое. Запасы файлов в сети Internet огромны, так что для поиска приходится использовать специальные средства, о которых мы еще будем говорить.

Для передачи файлов используется протокол FTP (File Transfer Protocol ), позволяющий переписывать файлы с дисков удаленного (возможно, очень удаленного…) сервера на локальный диск вашего компьютера. Разработаны удобные программы, напоминающие широко известную оболочку Norton Commander, упрощающие процесс передачи файлов. Примером может служить программа FTP-32 Client for Windows (рис. 1.10).

Рис. 1.10. Программа FTP-32 Client for Windows, предназначенная для передачи файлов по протоколу FTP

С левой стороны вы видите диски и каталоги вашего компьютера, с правой - удаленного. В нашем примере мы подключились к серверу FTP фирмы Microsoft, имеющей адрес ftp.microsoft.com.

Перемещаясь по каталогам удаленного компьютера, вы можете найти нужный вам файл и, выделив его, переслать к себе. Для пересылки нажмите кнопку с изображением стрелки, направленной влево.

Кнопка со стрелкой, направленной вправо, позволит вам переслать файл со своего локального диска на диск удаленного компьютера. Однако такая операция не всегда разрешена обыкновенному пользователю. Причина заключается в том, что пользователи, бесконтрольно записывая файлы на диск сервера, могут быстро переполнить его. Кроме того, открытые для записи каталоги могут служить местом распространения компьютерных вирусов.

При передаче файлов с помощью программы FTP-32 Client for Windows вы можете указать либо текстовый режим, либо двоичный, либо автоматический. Очевидно, что для передачи программ или архивов нужно использовать двоичный режим передачи, в то время как списки и описания файлов следует передавать в текстовом режиме. Если вы укажите режим передачи файлов неправильно, принятый файл будет искажен.


Ход процедуры копирования отображается в диалоговой панели Transfer Status (рис. 1.11) и вы можете за ним следить.



Рис. 1.11. Отображение хода процедуры копирования файла

В нижней части этой панели выводится объем переданных данных и скорость передачи в Kbps. Нажав кнопку Cancel вы можете отменить передачу файла. Это имеет смысл сделать, если скорость передачи слишком мала из-за низкого качества канала передачи или высокой загруженности сервера.

Средства удаленной передачи данных по протоколу FTP встроены теперь и в программу Norton File Manager , пришедшей в операционной системе Microsoft Windows 95 на смену программе Norton Commander.

Кроме того, для получения файлов из серверов FTP вы можете использовать программы-навигаторы, предназначенные для работы с серверами WWW. Последние становятся наиболее популярным средством хранения и представления информации в сети Internet.


Получение и установка Microsoft Internet Assistant


Вы можете получить этот редактор бесплатно с сервера www.microsoft.com в виде файла с именем wrdia20z.exe. Для установки вы должны просто запустить указанный файл и следовать инструкциям, появляющимся на экране. Разумеется, перед установкой редактора Microsoft Internet Assistant необходимо установить текстовый процессор Microsoft Word for Windows. Мы рекомендуем использовать версию 7.0 этого процессора, специально разработанную для операционных систем Microsoft Windows 95 и Microsoft Windows NT.



Получение программы WS_FTP


Прежде всего вам необходимо переписать к себе на диск программу WS_FTP с одного из серверов, указанных в документации к программе:

ftp.coast.net/SimTel/win3/winsock/ws_ftp.zip ftp.coast.net/SimTel/win3/winsock/ws_ftp32.zip winftp.cica.indiana.edu/pub/pc/win3/winsock/ws_ftp.zip winftp.cica.indiana.edu/pub/pc/win3/winsock/ws_ftp32.zip ftp.usma.edu/pub/msdos/winsock.files/ws_ftp.zip ftp.usma.edu/pub/msdos/winsock.files/ws_ftp32.zip ftp.csra.net/pub/win32 ftp>

Мы воспользуемся сервером ftp.csra.net.

Итак, запустите программу FTP и подсоединитесь к указанному серверу:

ftp> open ftp.csra.net Connected to news2.csra.net. 220 news2 Windows NT FTP Server (Version 3.5). User (news2.csra.net:(none)): anonymous 331 Anonymous access allowed, send identity (e-mail name) as password. Password:frolov@glas.apc.org 230 Anonymous user logged in as ftpuser (guest access). ftp>

В качестве имени используйте anonymous, а для пароля используйте свой полный почтовый адрес. Затем перейдите в каталог pub и посмотрите, какие файлы и каталоги в нем имеются:

ftp> cd pub 250 CWD command successful. ftp> dir 200 PORT command successful. 150 Opening ASCII mode data connection for /bin/ls. dr-xr-xr-x 1 owner group 0 Mar 1 22:01 msdos dr-xr-xr-x 1 owner group 0 Mar 1 22:00 win3 dr-xr-xr-x 1 owner group 0 Mar 2 7:21 win32 226 Transfer complete. 197 bytes received in 0.05 seconds (3.94 Kbytes/sec) ftp>

Нас интересуют версии программы WS_FTP для операционных систем Microsoft Windows 95 и Microsoft Windows NT, поэтому перейдите в каталог win32 и просмотрите его содержимое:

ftp> cd win32 250 CWD command successful. ftp> dir 200 PORT command successful. 150 Opening ASCII mode data connection for /bin/ls. -r-xr-xr-x 1 owner group 11906 Mar 1 21:59 watch95.txt -r-xr-xr-x 1 owner group 308610 Mar 1 20:09 watch95.zip -r-xr-xr-x 1 owner group 8631 Mar 1 21:57 ws_ftp32.txt -r-xr-xr-x 1 owner group 197468 Mar 2 7:21 ws_ftp32.zip -r-xr-xr-x 1 owner group 11851 Mar 1 21:57 ws_watch.txt -r-xr-xr-x 1 owner group 307757 Mar 1 20:10 ws_watch.zip -r-xr-xr-x 1 owner group 9006 Mar 1 21:57 wsftp32a.txt -r-xr-xr-x 1 owner group 201386 Mar 1 20:39 wsftp32a.zip -r-xr-xr-x 1 owner group 4633 Mar 1 21:58 wsping32.txt -r-xr-xr-x 1 owner group 57314 Mar 1 20:10 wsping32.zip 226 Transfer complete. 728 bytes received in 0.22 seconds (3.31 Kbytes/sec) ftp>


Теперь мы займемся получением текстовых и двоичных файлов, расположенных в этом каталоге. Сначала давайте получим все текстовые файлы, воспользовавашись для этого командой mget:

ftp> mget *.txt mget watch95.txt? y 200 PORT command successful. 150 Opening ASCII mode data connection for watch95.txt. mget wsftp32a.txt? y 200 PORT command successful. 150 Opening ASCII mode data connection for wsftp32a.txt. 226 Transfer complete. 9006 bytes received in 8.29 seconds (1.09 Kbytes/sec) mget wsping32.txt? y 200 PORT command successful. 150 Opening ASCII mode data connection for wsping32.txt. 226 Transfer complete. 4633 bytes received in 6.59 seconds (0.70 Kbytes/sec) mget ws_ftp32.txt? y 200 PORT command successful. 150 Opening ASCII mode data connection for ws_ftp32.txt. 226 Transfer complete. 8631 bytes received in 8.24 seconds (1.05 Kbytes/sec) ftp>

Перед тем как выполнить пересылку файла, команда mget запрашивает подтверждение, на которое вы должны ответить вводом символа y. Если вы запустили программу FTP в среде Microsoft Windows 95, то все принятые файлы по умолчанию будут записаны в тот каталог, где установлена эта операционная система.

Для передачи файлов программных архивов переключитесь в двоичный режим пересылки файлов:

ftp> binary 200 Type set to I. ftp>

Теперь можно выполнять пересылку:

ftp> mget *.zip mget watch95.zip? y 200 PORT command successful. 150 Opening BINARY mode data connection for watch95.zip. 226 Transfer complete. 308610 bytes received in 155.99 seconds (1.98 Kbytes/sec) mget wsftp32a.zip? y 200 PORT command successful. 150 Opening BINARY mode data connection for wsftp32a.zip. 226 Transfer complete. 201386 bytes received in 160.93 seconds (1.25 Kbytes/sec) mget wsping32.zip? y 200 PORT command successful. 150 Opening BINARY mode data connection for wsping32.zip. 226 Transfer complete. 57314 bytes received in 87.11 seconds (0.66 Kbytes/sec) mget ws_ftp32.zip? y 200 PORT command successful. 150 Opening BINARY mode data connection for ws_ftp32.zip. 226 Transfer complete. 197468 bytes received in 150.26 seconds (1.23 Kbytes/sec)

Выполнив пересылку, отключитесь от сервера FTP и завершите работу программы FTP про помощи команды bye.


Посылка ответа на статью в конференцию


Процедура посылки ответа на статью в конференцию очень похожа на только что описанную процедуру посылки ответа автору статьи по электронной почте. Разница заключается в том, что для подготовки отправляемого сообщения вы должны нажать кнопку подготовки ответа на статью для записи в конференцию, расположенную в инструментальной линейке главного окна приложения News Express .

После этого на экране появится окно, показанное на рис. 3.51.

Рис. 3.51. Окно, предназначенное для подготовки ответа на статью, посылаемого в конференцию

В этом окне поля Newsgroups и Subject (название конференции и тема сообщения) уже заполнены. Вы можете указать ключевое слово для поиска в поле Keyword

и краткое содержание вашего ответа в поле Summary, однако это необязательно.

Далее в окне цитируется текст исходной статьи. Вы можете отредактировать цитату и дописать свой ответ или комментарий к статье. Затем нажмите кнопку отправки статьи или сообщения, расположенную в инструментальной линейке главного окна приложения News Express и подтвердите свое желание послать сообщение в диалоговой панели Notice, нажав кнопку Yes.



Посылка письма автору статьи


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

После этого на экране появится окно, показанное на рис. 3.49, в котором вы должны подготовить текст письма.

Рис. 3.49. Подготовка ответа на статью

Обратите внимание, что поля Subject и To уже заполнены. Если вы желаете отправить кому-либо копию письма, заполните также поле Cc, записав в него электронный адрес второго корреспондента.

В окно автоматически копируются строки исходной статьи, которые выделяются символом ">". Вы можете удалить их все или только некоторые, Эти строки нужны для того, чтобы получив ваше письмо, автор статьи сразу понял, о чем идет речь. Свой ответ вы должны написать ниже цитируемых строк исходного сообщения.

Окно подготовки сообщения имеет свою инструментальную линейку с кнопками, перечисленными ниже.

Кнопка Описание
Операция удаления с копированием в универсальный буфер обмена Clipboard
Операция копирования в Clipboard

Операция вставки из Clipboard
Изменение шрифта, которым отображается текст сообщения (пропорциональный шрифт или шрифт с фиксированной шириной букв)
Вставка текстового файла, подготовленного заранее
При помощи этой кнопки можно отправить вместе с письмом двоичный файл
Отправка копии письма по почте
Копирование ответа в личный каталог
Использование для передачи данных протокола MIME

После того как вы подготовите текст письма, нажмите кнопку отправки статьи или сообщения, расположенную в инструментальной линейке главного окна приложения News Express . На экране появится диалоговая панель, в которой вы должны подтвердить свое желание отправить сообщение (рис. 3.50).

Рис. 3.50. Запрос на отправку сообщения



Представление табличных данных


Рано или поздно вам придется размещать на своей странице WWW табличные данные. Самый простой, но далеко не самый хороший способ создания таблиц известен со времен текстового редактора Лексикон - вы оформляете таблицу шрифтом с фиксированной шириной букв, а для выравнивания колонок используете символы пробела или табуляции.

Разумеется, вы можете поступить аналогичным образом и при размещении таблиц на странице WWW, однако лучше сделать это средствами языка HTML .

Воспользовавшись редактором Microsoft Internet Assistant for Microsoft Word одним легким движением мыши мы создали таблицу, состоящую из трех строк и трех столбцов, а затем с помощью клавиатуры заполнили ячейки этой таблицы, как это показано на рис. 4.6.

Рис. 4.6. Таблица, подготовленная с помощью редактора Microsoft Internet Assistant for Microsoft Word

Ниже мы привели текст полученного при этом документа:

<HTML > <HEAD> <TITLE>Untitled</TITLE> <META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0z"> </HEAD> <BODY>

<TABLE>

<TR> <TD WIDTH=197><FONT FACE="Times New Roman">000</FONT></TD> <TD WIDTH=197><FONT FACE="Times New Roman">001</FONT></TD> <TD WIDTH=197><FONT FACE="Times New Roman">002</FONT> </TD> </TR>

<TR> <TD WIDTH=197><FONT FACE="Times New Roman">010</FONT></TD> <TD WIDTH=197><FONT FACE="Times New Roman">011</FONT></TD> <TD WIDTH=197><FONT FACE="Times New Roman">012</FONT> </TD> </TR>

<TR> <TD WIDTH=197><FONT FACE="Times New Roman">100</FONT></TD> <TD WIDTH=197><FONT FACE="Times New Roman">101</FONT></TD> <TD WIDTH=197><FONT FACE="Times New Roman">102</FONT> </TD> </TR>


</TABLE>

<P> </BODY> </HTML >

Из этого текста хорошо видно, что таблица определена между командами <TABLE> и </TABLE> . Каждая строка таблицы ограничена командами <TR> и </TR> . Столбцы таблицы ограничены командами <TD…> и </TD> , причем у команды <TD…>

есть параметр - ширина столбца.

При необходимости вы можете создать таблицу с видимой рамкой, разделяющей строки и столбцы. Для этого в команде <TABLE> необходимо указать параметр BORDER, определяющий ширину рамки:

<TABLE BORDER="1">

При необходимости вы можете задать цвет рамки, указав параметр BORDERCOLOR, как это показано ниже:

<TABLE BORDER="4" BORDERCOLOR="#0000ff">

В этом примере таблица будет иметь толстую рамку синего цвета (рис. 4.5).



Рис. 4.5. Таблица с толстой рамкой


Приложение CLIENT


Исходные тексты приложения CLIENT, предназначенного для совместного использования с только что описанным приложением SERVER, приведены в листинге 5.4.

После запуска этого приложения вы должны создать канал связи с приложением SERVER, выбрав из меню File строку Connect, после чего можно посылать сообщение Test message, выбирая из этого же меню строку Send Message.

Сервер, получив сообщение, отобразит его на экране в отдельной диалоговой панели.

Листинг 5.4. Файл client/client.c

#include <windows.h> #include <windowsx.h> #include <winsock.h> #include <commctrl.h> #include "resource.h"

// ----------------------------------------------------- // Описание функций // -----------------------------------------------------

// Функция главного окна LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

// Функция для обработки сообщения WM_CREATE BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);

// Функция для обработки сообщения WM_DESTROY void WndProc_OnDestroy(HWND hWnd);

// Функция для обработки сообщения WM_COMMAND void WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify);

// Функция для обработки сообщения WM_SIZE void WndProc_OnSize(HWND hWnd, UINT state, int cx, int cy);

// Установка соединения void SetConnection(HWND hWnd);

// Передача сообщения void SendMsg(HWND hWnd);

// Порт сервера #define SERV_PORT 5000

#define IDS_STATUSBAR 802

// ----------------------------------------------------- // Глобальные переменные // -----------------------------------------------------

// Идентификатор приложения HINSTANCE hInst;

// Название приложения char szAppName[] = "WClient";

// Заголовок главного окна приложения char szAppTitle[] = "Windows Socket Client Demo";

// Идентификатор органа управления Statusbar HWND hwndSb;

// Сокет клиента SOCKET srv_socket ;

// Локальный сокет SOCKADDR _IN local_sin;

// Адрес сервера SOCKADDR _IN dest_sin;

// ----------------------------------------------------- // Функция WinMain // -----------------------------------------------------


int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; HWND hWnd; MSG msg;

hInst = hInstance;

// Преверяем, не было ли это приложение запущено ранее hWnd = FindWindow(szAppName, NULL); if(hWnd) { // Если окно приложения было свернуто в пиктограмму, // восстанавливаем его if(IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE);

// Выдвигаем окно приложения на передний план SetForegroundWindow(hWnd); return FALSE; }

// Регистрируем класс окна memset(&wc, 0, sizeof(wc));

// Поля wc.cbSize и wc.hIconSm определены в структуре // WNDCLASSEX, которой можно пользоваться для // регистрации класса окна в Windows 95 wc.cbSize = sizeof(WNDCLASSEX);

// Поле wc.hIconSm задает идентификатор маленькой // пиктограммы, которая будет отображаться в левой // части заголовка окна (в области системного меню). // Загружаем пиктограмму из ресурсов приложения при // помощи функции LoadImage, так как функция // LoadIcon может загрузить только обычную пиктограмму wc.hIconSm = LoadImage(hInst, MAKEINTRESOURCE(IDI_APPICON_SM), IMAGE_ICON, 16, 16, 0);

// Завершаем заполнение структуры WNDCLASSEX wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst;

// Для загрузки обычной пиктограммы вы можете // использовать функцию LoadImage wc.hIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_APPICON), IMAGE_ICON, 32, 32, 0);

wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); wc.lpszClassName = szAppName;

// Вызываем функцию RegisterClassEx, которая выполняет // регистрацию окна if(!RegisterClassEx(&wc))

// В случае ошибки пытаемся зарегистрировать окно // функцией RegisterClass if(!RegisterClass((LPWNDCLASS)&wc.style)) return FALSE;

// Инициализация библиотеки органов управления // общего назначения. Необходима для работы с // органом управления Statusbar InitCommonControls();



// Создаем главное окно приложения hWnd = CreateWindow(szAppName, szAppTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL); if(!hWnd) return(FALSE);

// Отображаем окно ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);

// Запускаем цикл обработки сообщений while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }

// ----------------------------------------------------- // Функция WndProc // -----------------------------------------------------

LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { // Для сообщения WM_CREATE назначаем обработчик, // расположенный в функции WndProc_OnCreate HANDLE_MSG(hWnd, WM_CREATE , WndProc_OnCreate);

// Для сообщения WM_COMMAND назначаем обработчик, // расположенный в функции WndProc_OnCommand HANDLE_MSG(hWnd, WM_COMMAND , WndProc_OnCommand);

// Для сообщения WM_SIZE назначаем обработчик, // расположенный в функции WndProc_OnSize HANDLE_MSG(hWnd, WM_SIZE , WndProc_OnSize);

// Для сообщения WM_DESTROY назначаем обработчик, // расположенный в функции WndProc_OnDestroy HANDLE_MSG(hWnd, WM_DESTROY , WndProc_OnDestroy);

default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } }

// ----------------------------------------------------- // Функция WndProc_OnCreate // -----------------------------------------------------

BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct) { int rc; WSADATA WSAData; char szTemp[128];

// Инициализация и проверка версии Windows Sockets rc = WSAStartup (MAKEWORD(1, 1), &WSAData); if(rc != 0) { MessageBox(NULL, "WSAStartup Error", "Error", MB_OK); return FALSE; }

// Отображаем описание и версию системы Windows Sockets // в окне органа управления Statusbar wsprintf(szTemp, "Server use %s %s", WSAData.szDescription,WSAData.szSystemStatus);

hwndSb = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER | SBARS_SIZEGRIP, szTemp, hWnd, IDS_STATUSBAR);



return TRUE; }

// ----------------------------------------------------- // Функция WndProc_OnDestroy // -----------------------------------------------------

#pragma warning(disable: 4098) void WndProc_OnDestroy(HWND hWnd) { // Освобождение ресурсов, полученных для // работы с Windows Sockets WSACleanup ();

// Завершение цикла обработки сообщений PostQuitMessage(0); return FORWARD_WM_DESTROY (hWnd, DefWindowProc); }

// ----------------------------------------------------- // Функция WndProc_OnSize // -----------------------------------------------------

#pragma warning(disable: 4098) void WndProc_OnSize( HWND hWnd, UINT state, int cx, int cy) { SendMessage(hwndSb, WM_SIZE , cx, cy); return FORWARD_WM_SIZE (hWnd, state, cx, cy, DefWindowProc); }

// ----------------------------------------------------- // Функция WndProc_OnCommand // -----------------------------------------------------

#pragma warning(disable: 4098) void WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify) { switch (id) { case IDM_EXIT:

// Уничтожение главного окна прилоджения DestroyWindow(hWnd); break;

case IDM_CONNECT:

// Установка соединения с сервером SetConnection(hWnd); break;

case IDM_SEND:

// Посылка сообщения серверу SendMsg(hWnd); break;

default: MessageBox(NULL, "Unknown command", "Error", MB_OK); }

return FORWARD_WM_COMMAND (hWnd, id, hwndCtl, codeNotify, DefWindowProc); }

// ----------------------------------------------------- // Функция SetConnection // -----------------------------------------------------

void SetConnection(HWND hWnd) { PHOSTENT phe;

// Создаем сокет srv_socket = socket(AF_INET , SOCK_STREAM, 0); if(srv_socket == INVALID_SOCKET) { MessageBox(NULL, "socket Error", "Error", MB_OK); return; }

// Устанавливаем адрес IP и номер порта dest_sin.sin_family = AF_INET ;

// Определяем адрес узла

// Адрес локального узла для отладки phe = gethostbyname ("localhost ");

// Адрес удаленного узла //phe = gethostbyname ("frolov");



if(phe == NULL) { closesocket (srv_socket); MessageBox(NULL, "gethostbyname Error", "Error", MB_OK); return; }

// Копируем адрес узла memcpy((char FAR *)&(dest_sin.sin_addr ), phe->h_addr , phe->h_length);

// Другой способ указания адреса узла // dest_sin.sin_addr .s_addr = inet_addr ("200.200.200.201");

// Копируем номер порта dest_sin.sin_port = htons(SERV_PORT);

// Устанавливаем соединение if(connect(srv_socket , (PSOCKADDR )&dest_sin, sizeof(dest_sin)) < 0) { closesocket (srv_socket); MessageBox(NULL, "connect Error", "Error", MB_OK); return; }

// В случае успеха выводим сообщение об установке // соединения с узлом SendMessage(hwndSb, SB_SETTEXT, 0, (LPARAM)"Connected"); }

// ----------------------------------------------------- // Функция SendMsg // -----------------------------------------------------

void SendMsg(HWND hWnd) { char szBuf[80]; lstrcpy(szBuf, "Test string");

// Посылаем сообщение send (srv_socket , szBuf, lstrlen(szBuf), 0); }

Вы сможете разобраться с исходными текстами этого прилжоения самостоятельно, так как все использованные в нем функции были нами уже описаны. Обратим ваше внимание только на функцию SetConnection, предназначенную для установки канала связи с сервером.

Если вы будете проверять работу приложений SERVER и CLIENT на одном и том же компьютере, адрес сервера должен быть указан следующим образом:

phe = gethostbyname ("localhost ");

Для того чтобы установить канал связи с компьютером по его имени, закройте символом комментария приведенную выше строку и уберите символ комментария со строки, расположенной ниже:

//phe = gethostbyname ("frolov");

Разумеется, вы должны также изменить имя компьютера.

Можно также указать адрес узла в виде десятичных цифр, для чего следует убрать символ комментария со следующей строки:

// dest_sin.sin_addr .s_addr = inet_addr ("200.200.200.201");

Идентификаторы ресурсов приложения CLIENT определены в файле resource.h, представленном в листинге 5.5.



Листинг 5.5. Файл client/resource.h

//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by CLIENT.rc // #define IDI_APPICON 101 #define IDI_APPICON_SM 102 #define IDR_MENU1 105 #define IDM_START 40001 #define IDM_EXIT 40002 #define IDM_STOP 40003 #define IDM_CONNECT 40004 #define IDM_SEND 40005

// Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 106 #define _APS_NEXT_COMMAND_VALUE 40006 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif

Файл client.rc (листинг 5.6) содержит определения ресурсов приложения.

Листинг 5.6. Файл client/client.rc

//Microsoft Developer Studio generated resource script. // #include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h"

///////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS

///////////////////////////////////////////////////////////////////// // Russian resources

#if !defined(AFX_RESOURCE_DLL) defined(AFX_TARG_RUS) #ifdef _WIN32 LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT #pragma code_page(1251) #endif //_WIN32

#ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////// // // TEXTINCLUDE //

1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END

2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END

3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END

#endif // APSTUDIO_INVOKED

///////////////////////////////////////////////////////////////////// // // Icon //

// Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_APPICON ICON DISCARDABLE "client.ico" IDI_APPICON_SM ICON DISCARDABLE "clientsm.ico"

///////////////////////////////////////////////////////////////////// // // Menu //

IDR_MENU1 MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&Connect", IDM_CONNECT MENUITEM "S&end message", IDM_SEND MENUITEM SEPARATOR MENUITEM "&Exit", IDM_EXIT END END

#endif // Russian resources /////////////////////////////////////////////////////////////////////

#ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. //

///////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED


Приложение CLIENTD


Исходные тексты приложения CLIENTD, предназначенного для совместной работы с приложением SERVERD, представлены в листинге 5.8. Так как это приложение очень похоже на приложение CLIENT, мы опишем только отличия.

Листинг 5.8. Файл clientd/clientd.c

#include <windows.h> #include <windowsx.h> #include <winsock.h> #include <commctrl.h> #include "resource.h"

// ----------------------------------------------------- // Описание функций // -----------------------------------------------------

// Функция главного окна LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

// Функция для обработки сообщения WM_CREATE BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);

// Функция для обработки сообщения WM_DESTROY void WndProc_OnDestroy(HWND hWnd);

// Функция для обработки сообщения WM_COMMAND void WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify);

// Функция для обработки сообщения WM_SIZE void WndProc_OnSize(HWND hWnd, UINT state, int cx, int cy);

// Установка соединения void SetConnection(HWND hWnd);

// Передача сообщения void SendMsg(HWND hWnd);

// Порт сервера #define SERV_PORT 5000

#define IDS_STATUSBAR 802

// ----------------------------------------------------- // Глобальные переменные // -----------------------------------------------------

// Идентификатор приложения HINSTANCE hInst;

// Название приложения char szAppName[] = "WClientUDP ";

// Заголовок главного окна приложения char szAppTitle[] = "Windows Socket UDP Client Demo";

// Идентификатор органа управления Statusbar HWND hwndSb;

// Сокет клиента SOCKET srv_socket ;

// Адрес сервера SOCKADDR _IN dest_sin;

// ----------------------------------------------------- // Функция WinMain // -----------------------------------------------------

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; HWND hWnd; MSG msg;

hInst = hInstance;


// Преверяем, не было ли это приложение запущено ранее hWnd = FindWindow(szAppName, NULL); if(hWnd) { // Если окно приложения было свернуто в пиктограмму, // восстанавливаем его if(IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE);

// Выдвигаем окно приложения на передний план SetForegroundWindow(hWnd); return FALSE; }

// Регистрируем класс окна memset(&wc, 0, sizeof(wc)); wc.cbSize = sizeof(WNDCLASSEX); wc.hIconSm = LoadImage(hInst, MAKEINTRESOURCE(IDI_APPICON_SM), IMAGE_ICON, 16, 16, 0); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_APPICON), IMAGE_ICON, 32, 32, 0);

wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); wc.lpszClassName = szAppName;

// Вызываем функцию RegisterClassEx, которая выполняет // регистрацию окна if(!RegisterClassEx(&wc)) if(!RegisterClass((LPWNDCLASS)&wc.style)) return FALSE;

InitCommonControls();

// Создаем главное окно приложения hWnd = CreateWindow(szAppName, szAppTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL); if(!hWnd) return(FALSE);

// Отображаем окно ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);

// Запускаем цикл обработки сообщений while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }

// ----------------------------------------------------- // Функция WndProc // -----------------------------------------------------

LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { HANDLE_MSG(hWnd, WM_CREATE , WndProc_OnCreate); HANDLE_MSG(hWnd, WM_COMMAND , WndProc_OnCommand); HANDLE_MSG(hWnd, WM_SIZE , WndProc_OnSize); HANDLE_MSG(hWnd, WM_DESTROY , WndProc_OnDestroy);

default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } }

// ----------------------------------------------------- // Функция WndProc_OnCreate // -----------------------------------------------------



BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct) { int rc; WSADATA WSAData; char szTemp[128];

// Инициализация и проверка версии Windows Sockets rc = WSAStartup (MAKEWORD(1, 1), &WSAData); if(rc != 0) { MessageBox(NULL, "WSAStartup Error", "Error", MB_OK); return FALSE; }

// Отображаем описание и версию системы Windows Sockets // в окне органа управления Statusbar wsprintf(szTemp, "Server use %s %s", WSAData.szDescription,WSAData.szSystemStatus);

hwndSb = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER | SBARS_SIZEGRIP, szTemp, hWnd, IDS_STATUSBAR);

return TRUE; }

// ----------------------------------------------------- // Функция WndProc_OnDestroy // -----------------------------------------------------

#pragma warning(disable: 4098) void WndProc_OnDestroy(HWND hWnd) { // Освобождение ресурсов, полученных для // работы с Windows Sockets WSACleanup ();

// Завершение цикла обработки сообщений PostQuitMessage(0); return FORWARD_WM_DESTROY (hWnd, DefWindowProc); }

// ----------------------------------------------------- // Функция WndProc_OnSize // -----------------------------------------------------

#pragma warning(disable: 4098) void WndProc_OnSize(HWND hWnd, UINT state, int cx, int cy) { SendMessage(hwndSb, WM_SIZE , cx, cy); return FORWARD_WM_SIZE (hWnd, state, cx, cy, DefWindowProc); }

// ----------------------------------------------------- // Функция WndProc_OnCommand // -----------------------------------------------------

#pragma warning(disable: 4098) void WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify) { switch (id) { case IDM_EXIT:

// Уничтожение главного окна прилоджения DestroyWindow(hWnd); break;

case IDM_CONNECT:

// Установка соединения с сервером SetConnection(hWnd); break;

case IDM_SEND:

// Посылка сообщения серверу SendMsg(hWnd); break;

default: MessageBox(NULL, "Unknown command", "Error", MB_OK); }

return FORWARD_WM_COMMAND (hWnd, id, hwndCtl, codeNotify, DefWindowProc); }



// ----------------------------------------------------- // Функция SetConnection // -----------------------------------------------------

void SetConnection(HWND hWnd) { PHOSTENT phe;

// Создаем сокет srv_socket = socket(AF_INET , SOCK_DGRAM, 0); if(srv_socket == INVALID_SOCKET) { MessageBox(NULL, "socket Error", "Error", MB_OK); return; }

// Связываем адрес IP с сокетом dest_sin.sin_family = AF_INET ; dest_sin.sin_addr .s_addr = INADDR_ANY ; dest_sin.sin_port = 0;

if(bind (srv_socket , (LPSOCKADDR )&dest_sin, sizeof(dest_sin)) == SOCKET_ERROR ) { // При ошибке закрываем сокет closesocket (srv_socket); MessageBox(NULL, "bind Error", "Error", MB_OK); return; }

// Устанавливаем адрес IP и номер порта dest_sin.sin_family = AF_INET ;

// Определяем адрес узла

// Адрес локального узла для отладки phe = gethostbyname ("localhost ");

// Адрес удаленного узла // phe = gethostbyname ("maxsinev");

if(phe == NULL) { closesocket (srv_socket); MessageBox(NULL, "gethostbyname Error", "Error", MB_OK); return; }

// Копируем адрес узла memcpy((char FAR *)&(dest_sin.sin_addr ), phe->h_addr , phe->h_length);

// Другой способ указания адреса узла // dest_sin.sin_addr .s_addr = inet_addr ("200.200.200.201");

// Копируем номер порта dest_sin.sin_port = htons(SERV_PORT);

// В случае успеха выводим сообщение об установке // соединения с узлом SendMessage(hwndSb, SB_SETTEXT, 0, (LPARAM)"Connected"); }

// ----------------------------------------------------- // Функция SendMsg // -----------------------------------------------------

void SendMsg(HWND hWnd) { char szBuf[80]; lstrcpy(szBuf, "Test string");

// Посылаем сообщение send to(srv_socket , szBuf, lstrlen(szBuf), 0, (PSOCKADDR )&dest_sin, sizeof(dest_sin)); }

Функция SetConnection создает сокет типа SOCK_DGRAM, так как передача данных будет выполняться с использованием протокола UDP :

srv_socket = socket(AF_INET , SOCK_DGRAM, 0);



Далее выполняется привязка сокета к адресу с помощью функции bind . При этом указывается нулевое значение порта и адрес INADDR_ANY , так как на данном этапе эти параметры не имеют значения.

Затем функция SetConnection записывает адрес сервера в структуру dest_sin. Этот адрес потребуется для передачи сообщений серверу.

При использовании протокола UDP и если не создан канал между приложениями, для передачи данных следует использовать функцию send to:

send to(srv_socket , szBuf, lstrlen(szBuf), 0, (PSOCKADDR )&dest_sin, sizeof(dest_sin));

В качестве предпоследнего параметра этой фукнции нужно передать адрес заполненной структуры, содержащей адрес узла, куда будет посылаться пакет данных. Через последний параметр функции send to необходимо передать размер указанной структуры.

Привдедем список возможных кодов ошибок для функции send to:

Код ошибки Описание
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEACCES Не был установлен флаг широковещательного адреса
WSAEINTR Работа функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAEFAULT Неправильно указан адрес буфера, содержащего передаваемые данные
WSAENETRESET Необходимо сбросить соединение
WSAENOBUFS Произошло зацикливание буферов
WSAENOTSOCK Указанный дескриптор не является дескриптором сокета
WSAESHUTDOWN Сокет был закрыт функцией shutdown
WSAEWOULDBLOCK Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
WSAEMSGSIZE Размер датаграммы больше, чем это допускается данной реализацией интерфейса Windows Sockets
WSAECONNABORTED Сбой из-за слишком большой задержки или по другой причине
WSAECONNRESET Сброс соединения удаленным узлом
WSAEADDRNOTAVAIL Указанный адрес недоступен
WSAEAFNOSUPPORT Данный тип сокета не может работать с указанным семейством адресов
WSAEDESTADDRREQ Необходимо указать адрес получателя датаграммы
WSAENETUNREACH В данное время и из данного узла невозможно получить доступ к сети
Заметим, что клиент может создать канал связи с сервером, вызвав функцию connect, и передавать по этому каналу пакеты UDP , пользуясь функциями send и recv . Этот способ удобен тем, что при передаче пакета не нужно каждый раз указывать адрес получателя.


Приложение FTP -PM для IBM OS/2 Warp Connect


В составе пакета IBM Internet Connection входит приложение FTP -PM, которое предназначено для обмена файлами с серверами FTP. И хотя это приложение не такое многофункциональное, как только что описанное приложение WS_FTP, оно также достаточно удобно в работе.

Для запуска приложения сделайте двойной щелчок левой клавишей мыши по пиктограмме FTP -PM, расположенной в папке Internet Utilities (рис. 2.64). Если вы уже установили соединение с Internet, то через некоторое время на экране появится главное окно приложения FTP-PM, показанное на рис. 3.15.

Рис. 3.15. Главное окно прилжоения FTP -PM после подключения к серверу GlasNet с адресом ftp.glas.apc.org

Для подключения к удаленному серверу FTP вы должны выбрать строку Open Remote Host из меню File. В появившейся на экране диалоговой панели FTP-PM - Open Remote Host (рис. 3.16) следует указать адрес удаленного сервера, имя пользователя и пароль.

Рис. 3.16. Диалоговая панель FTP -PM - Open Remote Host

В качестве имени пользователя следует указать anonymous, а в качестве пароля - свой электронный почтовый адрес.

После подключения в нижней части окна приложения FTP -PM появится содержимое каталогов удаленного узла. Передвигаться по дереву каталогов можно с помощью мыши, делая двойной щелчок по имени каталога или строке "..". В последнем случае будет выполнен переход в каталог более высокого уровня.

Перед тем как копировать файлы, вы должны указать режим передачи данных - текстовый или двоичный. Для этого выберите из меню Options строку Transfer mode. Далее в меню второго уровня выберите строку ASCII для текстового режима и Binary для двоичного.

Затем в том окне, где отображаются каталоги и файлы удаленного сервера, выделите нужный вам файл и выберите из главного меню строку QuickTrans. На экране появится диалоговая панель FTP -PM - Get Remote Files, на которой будет показано имя выбранного вами файла и другая информация. В этой диалоговой панели вы должны нажать кнопку YES, после чего начнется процесс передачи данных. Вы сможете наблюдать за этим процессом с помощью диалоговой панели FTP-PM - Transfer Progress, в которой будет отображаться объем переданных данных.



Приложение News Express


Несмотря на то что современные навигаторы Internet включают в себя средства работы с электронными конференциями, эти средства не всегда удобны. Особенно это сказывается при работе с двоичными конференциями .

В этом разделе мы расскажем вам о приложении News Express , которое нам кажется достаточно удобным и легким в использовании.



Приложение SERVER


В этом разделе мы представим вам исходные тексты приложения SERVER, которое выполняет прием сообщений от приложения CLIENT с использованием протокола гарантированной доставки TCP и канала связи. При необходимости вы сможете самостоятельно организовать передачу данных в обратном направлении.

Вы можете запускать приложения SERVER и CLIENT как на одном, так и на разных компьютерах, соединенных локальной или глобальной сетью TCP/IP. В случае запуска этих приложений на одном и том же компьютере в качестве адреса IP используется локальный тестовый адрес 127.0.0.1 .

Создавая проект для этого, а также всех остальных приложений, приведенных в нашей книге, вы должны указать, что для разрешения внешних ссылок необходимо использовать библиотеки объектных модулей wsock32.lib и comctl32.lib . Первая из них нужна для работы с программным интерфейсом Windows Sockets, вторая - для работы с органом управления Statusbar .

Для подключения указанных библиотек из меню Build системы разработки Microsoft Visual C++ версии 4.0 нужно выбрать строку Settings. На экране появится блокнот project Settings, который следует открыть на странице Link. Затем вы должны дописать названия библиотек в поле Object/library modules и нажать кнопку OK.

Исходный текст приложения SERVER представлен в листинге 5.1.

Листинг 5.1. Файл server/server.c

#include <windows.h> #include <windowsx.h> #include <winsock.h> #include <commctrl.h> #include "resource.h"

// ----------------------------------------------------- // Описание функций // -----------------------------------------------------

// Функция главного окна LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

// Функция для обработки сообщения WM_CREATE BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);

// Функция для обработки сообщения WM_DESTROY void WndProc_OnDestroy(HWND hWnd);

// Функция для обработки сообщения WM_COMMAND void WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify);


// Функция для обработки сообщения WM_SIZE void WndProc_OnSize(HWND hWnd, UINT state, int cx, int cy);

// Запуск сервера void ServerStart(HWND hWnd);

// Останов сервера void ServerStop(HWND hWnd);

// Обработка сообщения WSA_ACCEPT void WndProc_OnWSAAccept(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

// Обработка сообщения WSA_NETEVENT void WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // Порт сервера #define SERV_PORT 5000

#define IDS_STATUSBAR 802 // Определение кодов сообщений #define WSA_ACCEPT (WM_USER + 1) #define WSA_NETEVENT (WM_USER + 2)

// ----------------------------------------------------- // Глобальные переменные // -----------------------------------------------------

// Идентификатор приложения HINSTANCE hInst;

// Название приложения char szAppName[] = "WServer";

// Заголовок главного окна приложения char szAppTitle[] = "Windows Socket Server Demo";

// Идентификатор органа Statusbar HWND hwndSb;

// Сокет сервера SOCKET srv_socket ;

// Длина использованного сокета int acc_sin_len;

// Адрес использованного сокета SOCKADDR _IN acc_sin;

// Локальный сокет SOCKADDR _IN local_sin;

// ----------------------------------------------------- // Функция WinMain // -----------------------------------------------------

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; HWND hWnd; MSG msg;

hInst = hInstance;

// Преверяем, не было ли это приложение запущено ранее hWnd = FindWindow(szAppName, NULL); if(hWnd) { // Если окно приложения было свернуто в пиктограмму, // восстанавливаем его if(IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE);

// Выдвигаем окно приложения на передний план SetForegroundWindow(hWnd); return FALSE; }

// Регистрируем класс окна memset(&wc, 0, sizeof(wc));

// Поля wc.cbSize и wc.hIconSm определены в структуре // WNDCLASSEX, которой можно пользоваться для // регистрации класса окна в Windows 95 wc.cbSize = sizeof(WNDCLASSEX);



// Поле wc.hIconSm задает идентификатор маленькой // пиктограммы, которая будет отображаться в левой // части заголовка окна (в области системного меню). // Загружаем пиктограмму из ресурсов приложения при // помощи функции LoadImage, так как функция // LoadIcon может загрузить только обычную пиктограмму wc.hIconSm = LoadImage(hInst, MAKEINTRESOURCE(IDI_APPICON_SM), IMAGE_ICON, 16, 16, 0);

// Завершаем заполнение структуры WNDCLASSEX wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst;

// Для загрузки обычной пиктограммы вы можете // использовать функцию LoadImage wc.hIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_APPICON), IMAGE_ICON, 32, 32, 0);

wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); wc.lpszClassName = szAppName;

// Вызываем функцию RegisterClassEx, которая выполняет // регистрацию окна if(!RegisterClassEx(&wc))

// В случае ошибки пытаемся зарегистрировать окно // функцией RegisterClass if(!RegisterClass((LPWNDCLASS)&wc.style)) return FALSE;

// Инициализация библиотеки органов управления // общего назначения. Необходима для работы с // органом управления Statusbar InitCommonControls();

// Создаем главное окно приложения hWnd = CreateWindow(szAppName, szAppTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL); if(!hWnd) return(FALSE);

// Отображаем окно ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);

// Запускаем цикл обработки сообщений while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }

// ----------------------------------------------------- // Функция WndProc // -----------------------------------------------------

LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { // Вызываем обработчик сообщения WSA_ACCEPT case WSA_ACCEPT: WndProc_OnWSAAccept(hWnd, msg, wParam, lParam); break;



// Вызываем обработчик сообщения WSA_NETEVENT case WSA_NETEVENT: WndProc_OnWSANetEvent(hWnd, msg, wParam, lParam); break;

// Для сообщения WM_CREATE назначаем обработчик, // расположенный в функции WndProc_OnCreate HANDLE_MSG(hWnd, WM_CREATE , WndProc_OnCreate);

// Для сообщения WM_COMMAND назначаем обработчик, // расположенный в функции WndProc_OnCommand HANDLE_MSG(hWnd, WM_COMMAND , WndProc_OnCommand);

// Для сообщения WM_SIZE назначаем обработчик, // расположенный в функции WndProc_OnSize HANDLE_MSG(hWnd, WM_SIZE , WndProc_OnSize);

// Для сообщения WM_DESTROY назначаем обработчик, // расположенный в функции WndProc_OnDestroy HANDLE_MSG(hWnd, WM_DESTROY , WndProc_OnDestroy);

default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } }

// ----------------------------------------------------- // Функция WndProc_OnCreate // -----------------------------------------------------

BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct) { int rc; WSADATA WSAData; char szTemp[128];

// Инициализация и проверка версии Windows Sockets rc = WSAStartup (MAKEWORD(1, 1), &WSAData); if(rc != 0) { MessageBox(NULL, "WSAStartup Error", "Error", MB_OK); return FALSE; }

// Отображаем описание и версию системы Windows Sockets // в окне органа управления Statusbar wsprintf(szTemp, "Server use %s %s", WSAData.szDescription,WSAData.szSystemStatus);

hwndSb = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER | SBARS_SIZEGRIP, szTemp, hWnd, IDS_STATUSBAR);

return TRUE; }

// ----------------------------------------------------- // Функция WndProc_OnDestroy // -----------------------------------------------------

// Отключаем предупреждающее сообщение о том, что // функция типа void возвращает управление при помощи // оператора return. Этот оператор нужен для // использования макрокоманды FORWARD_WM_LBUTTONDOWN #pragma warning(disable: 4098) void WndProc_OnDestroy(HWND hWnd) { // Освобождение ресурсов, полученных для // работы с Windows Sockets WSACleanup ();



// Завершение цикла обработки сообщений PostQuitMessage(0); return FORWARD_WM_DESTROY (hWnd, DefWindowProc); }

// ----------------------------------------------------- // Функция WndProc_OnSize // -----------------------------------------------------

#pragma warning(disable: 4098) void WndProc_OnSize( HWND hWnd, UINT state, int cx, int cy) { SendMessage(hwndSb, WM_SIZE , cx, cy); return FORWARD_WM_SIZE (hWnd, state, cx, cy, DefWindowProc); }

// ----------------------------------------------------- // Функция WndProc_OnCommand // -----------------------------------------------------

#pragma warning(disable: 4098) void WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify) { switch (id) { case IDM_EXIT:

// Уничтожение главного окна приложения DestroyWindow(hWnd); break;

case IDM_START:

// Запуск сервера ServerStart(hWnd); break;

case IDM_STOP:

// Останов сервера ServerStop(hWnd); break;

default: MessageBox(NULL, "Unknown command", "Error", MB_OK); }

return FORWARD_WM_COMMAND (hWnd, id, hwndCtl, codeNotify, DefWindowProc); }

// ----------------------------------------------------- // Функция ServerStart // -----------------------------------------------------

void ServerStart(HWND hWnd) { struct sockaddr_in srv_address; int rc;

// Создаем сокет сервера для работы с потоком данных srv_socket = socket(AF_INET , SOCK_STREAM, 0); if(srv_socket == INVALID_SOCKET) { MessageBox(NULL, "socket Error", "Error", MB_OK); return; }

// Устанавливаем адрес IP и номер порта srv_address.sin_family = AF_INET ; srv_address.sin_addr .s_addr = INADDR_ANY ; srv_address.sin_port = htons(SERV_PORT);

// Связываем адрес IP с сокетом if(bind (srv_socket , (LPSOCKADDR )&srv_address, sizeof(srv_address)) == SOCKET_ERROR ) { // При ошибке закрываем сокет closesocket (srv_socket); MessageBox(NULL, "bind Error", "Error", MB_OK); return; }

// Устанавливаем сокет в режим приема для // выполнения ожидания соединения с клиентом if(listen(srv_socket , 1) == SOCKET_ERROR ) { closesocket (srv_socket); MessageBox(NULL, "listen Error", "Error", MB_OK); return; }



// При попытке установки соединения главное окно приложения // получит сообщение WSA_ACCEPT rc = WSAAsyncSelect (srv_socket , hWnd, WSA_ACCEPT, FD_ACCEPT ); if(rc > 0) { closesocket (srv_socket); MessageBox(NULL, "WSAAsyncSelect Error", "Error", MB_OK); return; }

// Выводим в окна Statusbar сообщение о запуске сервера SendMessage(hwndSb, SB_SETTEXT, 0, (LPARAM)"Server started"); }

// ----------------------------------------------------- // Функция ServerStop // -----------------------------------------------------

void ServerStop(HWND hWnd) { // Отменяем приход любых извещений в главную функцию // окна при возникновении любых событий, связанных // с системой Windows Sockets WSAAsyncSelect (srv_socket , hWnd, 0, 0);

// Если сокет был создан, закрываем его if(srv_socket != INVALID_SOCKET) { closesocket (srv_socket); }

// Выводим в окна Statusbar сообщение об останове сервера SendMessage(hwndSb, SB_SETTEXT, 0, (LPARAM)"Server stopped"); }

// ----------------------------------------------------- // Функция WndProc_OnWSAAccept // -----------------------------------------------------

void WndProc_OnWSAAccept(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { int rc;

// При ошибке отменяем поступление извещений // в главное окно приложения if(WSAGETSELECTERROR(lParam) != 0) { MessageBox(NULL, "accept Error", "Error", MB_OK); WSAAsyncSelect (srv_socket , hWnd, 0, 0); return; }

// Определяем размер адреса сокета acc_sin_len = sizeof(acc_sin);

// Разрешаем установку соединения srv_socket = accept (srv_socket, (LPSOCKADDR )&acc_sin, (int FAR *)&acc_sin_len);

if(srv_socket == INVALID_SOCKET) { MessageBox(NULL, "accept Error, invalid socket ", "Error", MB_OK); return; }

// Если на данном сокете начнется передача данных от // клиента, в главное окно приложения поступит // сообщение WSA_NETEVENT. // Это же сообщение поступит при разрыве соединения rc = WSAAsyncSelect (srv_socket , hWnd, WSA_NETEVENT, FD_READ | FD_CLOSE ); if(rc > 0) { closesocket (srv_socket); MessageBox(NULL, "WSAAsyncSelect Error", "Error", MB_OK); return; } }



// ----------------------------------------------------- // Функция WndProc_OnWSANetEvent // -----------------------------------------------------

void WndProc_OnWSANetEvent( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { char szTemp[256]; int rc;

// Если на сокете выполняется передача данных, // принимаем и отображаем эти данные в виде // текстовой строки if(WSAGETSELECTEVENT(lParam) == FD_READ ) { rc = recv ((SOCKET)wParam, szTemp, 256, 0); if(rc) { szTemp[rc] = '\0'; MessageBox(NULL, szTemp, "Reсeived data", MB_OK); } return; }

// Если соединение завершено, выводми об этом сообщение else if(WSAGETSELECTEVENT(lParam) == FD_CLOSE ) { MessageBox(NULL, "Connection closed", "Server", MB_OK); } }

Функция WinMain сохраняет идентификатор приложения и затем проверяет, не было ли это приложение уже запущено. При этом используется техника, описанная нами в 22 томе "Библиотеки системного программиста", который называется "Операционная система Windows 95 для программиста".

Далее выполняется обычная регистрация класса главного окна приложения, инициализируется библиотека орагнов управления общего назначения и создается главное окно приложения. После этого окно отображается на экране и запускается цикл обработки сообщений.

Функция окна WndProc обрабатывает как стандартные сообщения WM_CREATE , WM_COMMAND , WM_SIZE , WM_DESTROY , так и сообщения WSA_ACCEPT и WSA_NETEVENT. Первое из них возникает при установке канала связи с клиентом, второе - при поступлении данных от клиента и при разрыве канала связи.

Обработчик сообщения WM_CREATE инициализирует библиотеку Windows Sockets и создает орган управления Statusbar . В окне этого органа управления отображается текущая версия и описание состояния системы Windows Sockets. Если вы не знакомы с указанным органам управления, отсылаем вас к упомянутому 22 тому "Библиотеки системного программиста".

Обработчик сообщения WM_DESTROY вызывает функцию WSACleanup , освобождающую ресурсы, полученные для приложения у системы Windows Sockets и затем завершает цикл обработки сообщений.



Единственное назначение обработчика сообщений WM_SIZE заключается в изменении размеров окна органа управления Statusbar при изменении размеров главного окна приложения.

Обработчик сообщения WM_COMMAND получает управление, когда пользователь выбирает одну из строк в меню File главного меню приложения. Если пользователь выберет строку Start server, будет вызвана функция ServerStart, назначение которой очевидно из ее названия. Аналогично, при выборе строки Stop server будет вызвана функция ServerStop. Если же из меню

File выбрать строку Exit, будет уничтожено главное окно приложения.

Функция ServerStart создает сокет для работы с потоком данных и инициализирует его. При этом мы используем произвольно выбранный порт с номером 5000.

Далее функция выполняет привязку сокета к адресу и переключает сокет в режим приема для выполнения ожидания соединения с клиентом, т. е. выполняет описанные нами ранее действия, необходимые для создания канала связи.

Затем вызывается функция WSAAsyncSelect , которой в качестве последнего параметра передается значение FD_ACCEPT , а в качестве предпоследнего - значение WSA_ACCEPT. В результате при поступлении от клиента запроса на создание канала связи функция главного окна приложения получит сообщение WSA_ACCEPT.

Перед возвратом управления функция ServerStart выводит сообщение о запуске сервера в окне органа управления Statusbar .

Функция ServerStop отменяет все извещения, поступающие в главное окно приложения при возникновении событий в сети, вызывая функцию WSAAsyncSelect с нулевым значением двух последних параметров:

WSAAsyncSelect (srv_socket , hWnd, 0, 0);

Затем она закрывает сокет, вызывая функцию closesocket , и выводит в окне органа управления Statusbar сообщение о завершении работы сервера.

Функция WndProc_OnWSAAccept обрабатывает сообщение WSA_ACCEPT, выполняя описанную нами ранее процедуру создания канала связи.

И, наконец, функция WndProc_OnWSANetEvent выполняет прием строки сообщения, полученной от клиента с отображением этой строки на экране в диалоговой панели.



Файл resource.h, показанный в листинге 5.2 создается автоматически и содержит описание идентификаторов ресурсов приложения.

Листинг 5.2. Файл server/resource.h

//{{NO_DEPENDENCIES}} // Microsoft Developer Studio generated include file. // Used by server.rc // #define IDI_APPICON 101 #define IDI_APPICON_SM 102 #define IDR_MENU1 105 #define IDM_START 40001 #define IDM_EXIT 40002 #define IDM_STOP 40003

// Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 106 #define _APS_NEXT_COMMAND_VALUE 40004 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif

Ресурсы приложения определены в файле server.rc, который представлен в листинге 5.3.

Листинг 5.3. Файл server/server.rc

//Microsoft Developer Studio generated resource script. // #include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h"

///////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS

///////////////////////////////////////////////////////////////////// // Russian resources

#if !defined(AFX_RESOURCE_DLL) defined(AFX_TARG_RUS) #ifdef _WIN32 LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT #pragma code_page(1251) #endif //_WIN32

#ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////// // // TEXTINCLUDE //

1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END

2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""\r\n" "\0" END

3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END

#endif // APSTUDIO_INVOKED

///////////////////////////////////////////////////////////////////// // // Icon //

// Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_APPICON ICON DISCARDABLE "server.ico" IDI_APPICON_SM ICON DISCARDABLE "serversm.ico"

///////////////////////////////////////////////////////////////////// // // Menu //

IDR_MENU1 MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&Start server", IDM_START MENUITEM "S&top server", IDM_STOP MENUITEM SEPARATOR MENUITEM "&Exit", IDM_EXIT END END

#endif // Russian resources /////////////////////////////////////////////////////////////////////

#ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. //

///////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED


Приложение SERVERD


В некоторых случаях целесообразно использовать протокол негарантированной доставки UDP , так как он, например, допускает одновременную рассылку пакетов всем узлам сети (в режиме broadcast).

Если узлы обмениваются данными с использованием датаграммного протокола UDP , им не требуется создавать канал данных, поэтому процедура инициализации получается проще.

Сервер UDP должен создать сокет с помощью функции socket и привязать к нему адрес IP, вызвав функцию bind . Клиент UDP выполняет создание и инициализацию сокетов аналогичным образом с помощью все тех же функций socket и bind.

Такие известные вам из предыдущих приложений функции, как connect, listen и

accept в приложениях UDP использовать не нужно.

Для обмена данными приложения UDP вызывают функции send to и recv from, аналогичные функциям send и recv, но имеющие одно отличие - при вызове этих функций им необходимо задавать дополнительные параметры, имеющие отношение к адресам узлов. Функции sendto нужно указать адрес, по которому будет отправлен пакет данных, а функции

recvfrom - указатель на структуру, в которую будет записан адрес отправителя пакета.

В нашей книге мы привели исходные тексты приложений SERVERD и CLIENTD, которые выполняют те же задачи, что и только что рассмотренные приложения SERVER и CLIENT, но при этом они передают данные при помощи датаграммного протокола UDP .

Исходный текст приложения SERVERD

приведен в листинге 5.7.

Листинг 5.7. Файл serverd/serverd.c

#include <windows.h> #include <windowsx.h> #include <winsock.h> #include <commctrl.h> #include "resource.h"

// ----------------------------------------------------- // Описание функций // -----------------------------------------------------

// Функция главного окна LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

// Функция для обработки сообщения WM_CREATE BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);

// Функция для обработки сообщения WM_DESTROY void WndProc_OnDestroy(HWND hWnd);


// Функция для обработки сообщения WM_COMMAND void WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify);

// Функция для обработки сообщения WM_SIZE void WndProc_OnSize(HWND hWnd, UINT state, int cx, int cy);

// Запуск сервера void ServerStart(HWND hWnd);

// Останов сервера void ServerStop(HWND hWnd);

// Обработка сообщения WSA_NETEVENT void WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); // Порт сервера #define SERV_PORT 5000

#define IDS_STATUSBAR 802

// Определение кодов сообщений #define WSA_NETEVENT (WM_USER + 1)

// ----------------------------------------------------- // Глобальные переменные // -----------------------------------------------------

// Идентификатор приложения HINSTANCE hInst;

// Название приложения char szAppName[] = "WServerUDP ";

// Заголовок главного окна приложения char szAppTitle[] = "Windows Socket UDP Server Demo";

// Идентификатор органа Statusbar HWND hwndSb;

// Сокет сервера SOCKET srv_socket ;

// ----------------------------------------------------- // Функция WinMain // -----------------------------------------------------

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wc; HWND hWnd; MSG msg;

hInst = hInstance;

// Преверяем, не было ли это приложение запущено ранее hWnd = FindWindow(szAppName, NULL); if(hWnd) { // Если окно приложения было свернуто в пиктограмму, // восстанавливаем его if(IsIconic(hWnd)) ShowWindow(hWnd, SW_RESTORE);

// Выдвигаем окно приложения на передний план SetForegroundWindow(hWnd); return FALSE; }

// Регистрируем класс окна memset(&wc, 0, sizeof(wc)); wc.cbSize = sizeof(WNDCLASSEX); wc.hIconSm = LoadImage(hInst, MAKEINTRESOURCE(IDI_APPICON_SM), IMAGE_ICON, 16, 16, 0); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_APPICON), IMAGE_ICON, 32, 32, 0);



wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); wc.lpszClassName = szAppName;

// Вызываем функцию RegisterClassEx, которая выполняет // регистрацию окна if(!RegisterClassEx(&wc)) if(!RegisterClass((LPWNDCLASS)&wc.style)) return FALSE;

InitCommonControls();

// Создаем главное окно приложения hWnd = CreateWindow(szAppName, szAppTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInst, NULL); if(!hWnd) return(FALSE);

// Отображаем окно ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);

// Запускаем цикл обработки сообщений while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }

// ----------------------------------------------------- // Функция WndProc // -----------------------------------------------------

LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { // Вызываем обработчик сообщения WSA_NETEVENT case WSA_NETEVENT: WndProc_OnWSANetEvent(hWnd, msg, wParam, lParam); break;

HANDLE_MSG(hWnd, WM_CREATE , WndProc_OnCreate); HANDLE_MSG(hWnd, WM_COMMAND , WndProc_OnCommand); HANDLE_MSG(hWnd, WM_SIZE , WndProc_OnSize); HANDLE_MSG(hWnd, WM_DESTROY , WndProc_OnDestroy);

default: return(DefWindowProc(hWnd, msg, wParam, lParam)); } }

// ----------------------------------------------------- // Функция WndProc_OnCreate // -----------------------------------------------------

BOOL WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct) { int rc; WSADATA WSAData; char szTemp[128];

// Инициализация и проверка версии Windows Sockets rc = WSAStartup (MAKEWORD(1, 1), &WSAData); if(rc != 0) { MessageBox(NULL, "WSAStartup Error", "Error", MB_OK); return FALSE; }

// Отображаем описание и версию системы Windows Sockets // в окне органа управления Statusbar wsprintf(szTemp, "Server use %s %s", WSAData.szDescription,WSAData.szSystemStatus);



hwndSb = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER | SBARS_SIZEGRIP, szTemp, hWnd, IDS_STATUSBAR);

return TRUE; }

// ----------------------------------------------------- // Функция WndProc_OnDestroy // ----------------------------------------------------- #pragma warning(disable: 4098) void WndProc_OnDestroy(HWND hWnd) { // Освобождение ресурсов, полученных для // работы с Windows Sockets WSACleanup ();

// Завершение цикла обработки сообщений PostQuitMessage(0); return FORWARD_WM_DESTROY (hWnd, DefWindowProc); }

// ----------------------------------------------------- // Функция WndProc_OnSize // -----------------------------------------------------

#pragma warning(disable: 4098) void WndProc_OnSize( HWND hWnd, UINT state, int cx, int cy) { SendMessage(hwndSb, WM_SIZE , cx, cy); return FORWARD_WM_SIZE (hWnd, state, cx, cy, DefWindowProc); }

// ----------------------------------------------------- // Функция WndProc_OnCommand // -----------------------------------------------------

#pragma warning(disable: 4098) void WndProc_OnCommand(HWND hWnd, int id, HWND hwndCtl, UINT codeNotify) { switch (id) { case IDM_EXIT:

// Уничтожение главного окна прилоджения DestroyWindow(hWnd); break;

case IDM_START:

// Запуск сервера ServerStart(hWnd); break;

case IDM_STOP:

// Останов сервера ServerStop(hWnd); break;

default: MessageBox(NULL, "Unknown command", "Error", MB_OK); }

return FORWARD_WM_COMMAND (hWnd, id, hwndCtl, codeNotify, DefWindowProc); }

// ----------------------------------------------------- // Функция ServerStart // -----------------------------------------------------

void ServerStart(HWND hWnd) { struct sockaddr_in srv_address; int rc;

// Создаем сокет сервера для работы с потоком данных srv_socket = socket(AF_INET , SOCK_DGRAM, 0); if(srv_socket == INVALID_SOCKET) { MessageBox(NULL, "socket Error", "Error", MB_OK); return; }

// Устанавливаем адрес IP и номер порта srv_address.sin_family = AF_INET ; srv_address.sin_addr .s_addr = INADDR_ANY ; srv_address.sin_port = htons(SERV_PORT);



// Связываем адрес IP с сокетом if(bind (srv_socket , (LPSOCKADDR )&srv_address, sizeof(srv_address)) == SOCKET_ERROR ) { // При ошибке закрываем сокет closesocket (srv_socket); MessageBox(NULL, "bind Error", "Error", MB_OK); return; }

// Если на данном сокете начнется передача данных от // клиента, в главное окно приложения поступит // сообщение WSA_NETEVENT. rc = WSAAsyncSelect (srv_socket , hWnd, WSA_NETEVENT, FD_READ ); if(rc > 0) { closesocket (srv_socket); MessageBox(NULL, "WSAAsyncSelect Error", "Error", MB_OK); return; }

// Выводим в окна Statusbar сообщение о запуске сервера SendMessage(hwndSb, SB_SETTEXT, 0, (LPARAM)"Server started"); }

// ----------------------------------------------------- // Функция ServerStop // -----------------------------------------------------

void ServerStop(HWND hWnd) { // Отменяем приход любых извещений в главную функцию // окна при возникновении любых событий, связанных // с системой Windows Sockets WSAAsyncSelect (srv_socket , hWnd, 0, 0);

// Если сокет был создан, закрываем его if(srv_socket != INVALID_SOCKET) { closesocket (srv_socket); }

// Выводим в окна Statusbar сообщение об останове сервера SendMessage(hwndSb, SB_SETTEXT, 0, (LPARAM)"Server stopped"); }

// ----------------------------------------------------- // Функция WndProc_OnWSANetEvent // -----------------------------------------------------

void WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { char szTemp[256]; int rc; SOCKADDR _IN addr; int nAddrSize; char szBuf[80]; LPSTR lpAddr;

if(WSAGETSELECTEVENT(lParam) == FD_READ ) { // Принимаем данные rc = recv from((SOCKET)wParam, szTemp, 256, 0, (PSOCKADDR )&addr, &nAddrSize);

if(rc) { szTemp[rc] = '\0'; strcpy(szBuf, "Received from ");

// Преобразовываем адрес IP удаленного клиента // в текстовую строку lpAddr = inet_ntoa (addr.sin_addr ); strcat(szBuf, lpAddr);

// Отображаем адрес удаленного клиента // и полученную от него строку MessageBox(NULL, szTemp, szBuf, MB_OK); } return; } }



Приложение SERVERD во многом напоминает приложение SERVER, поэтому мы рассмотрим только отличия.

Первое отличие заключается в том, что при запуске сервера тип создаваемого сокета указывается как SOCK_DGRAM:

srv_socket = socket(AF_INET , SOCK_DGRAM, 0);

Далее выполняется инициализация сокета и его привязка к адресу, для чего вызывается функция bind . Эта операция, как и в случае протокола TCP, не обязательна.

После выполнения привязки можно приступать к получению пакетов данных от клиента. Для того чтобы не выполнять ожидание пакетов в цикле, наше приложение использует функцию WSAAsyncSelect , указывая с ее помощью, что при получении пакетов данных главное окно приложения должно получать сообщения с кодом WSA_NETEVENT:

rc = WSAAsyncSelect (srv_socket , hWnd, WSA_NETEVENT, FD_READ );

На этом инициализация сервера завершается.

Обработчик сообщения WSA_NETEVENT читает полученный пакет с помощью функции recv from:

SOCKADDR _IN addr; int nAddrSize; rc = recv from((SOCKET)wParam, szTemp, 256, 0, (PSOCKADDR )&addr, &nAddrSize);

В качестве предпоследнего параметра этой функции передается адрес структуры типа SOCKADDR _IN, куда функция записывает адрес узла, приславшего пакет. Последний параметр функции recv from должен содержать размер указанной структуры.

Ниже мы привели возможные коды ошибок для функции recv from.

Код ошибки Описание
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEFAULT Слишком малое значение параметра, определяющего размер буфера для приема данных
WSAEINTR Работа функции была отменена при помощи функции WSACancelBlockingCall
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAEINVAL Сокет не был подключен функцией bind
WSAENOTSOCK Указанный дескриптор не является дескриптором сокета
WSAESHUTDOWN Сокет был закрыт функцией shutdown
WSAEWOULDBLOCK Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
WSAEMSGSIZE Размер датаграммы слишком большой, поэтому соответствующий блок данных не помещается в буфер. Принятый блок данных был обрезан
WSAECONNABORTED Сбой из-за слишком большой задержки или по другой причине
WSAECONNRESET Сброс соединения удаленным узлом
Заметим, что при обмене данных с использованием протокола UDP на каждый вызов функции send to должен приходиться один вызов функции recv from. Если же вы передается данные через канал с использованием протокола TCP, на один вызов функции send может приходиться несколько вызовов функции recv.

Для отображения адреса узла, пославшего пакет UDP , наше приложение преобразует этот адрес в символьную строку с помощью функции inet_ntoa :

lpAddr = inet_ntoa (addr.sin_addr );

Эта функция записывает полученную строку в статическую область памяти, принадлежащую системе Windows Sockets, поэтому для дальнейшего использования необходимо скопировать строку до следующего вызова любой функции программного интерфейса Windows Sockets.


Приложение WS_FTP для Microsoft Windows


Программа WS_FTP представляет собой шаг (или несколько шагов?) вперед по сравнению с только что описанной программой FTP, так как она обеспечивает существенно более удобный способ работы с серверами FTP. Еще один способ работы с серверами FTP основан на использовании приложений-навигаторов WWW , о которых мы расскажем в этой главе немного позже.

Общее представление об использовании программы WS_FTP вы получили из первой главы нашей книги. Здесь мы дадим конкретные рекомендации по получению этой программы из сети Internet, по ее установке, настройке и использованию.



ПРИЛОЖЕНИЯ ДЛЯ INTERNET


По мере развития сети Internet появился новый класс приложений, ориентированных на эту сеть (мы будем называть их приложениями Internet). Эти приложения обеспечивают доступ к серверам WWW , FTP , GOPHER, предоставляют возможность работать с электронными конференциями и электронной почтой. Приложения Internet созданы для самых разных операционных систем, от MS-DOS до Microsoft Windows NT, IBM OS/2 и различных версий UNIX.

В предыдущей главе мы научили вас устанавливать соединение с Internet, пользуясь протоколами PPP и TCP/IP. Теперь вы узнаете о том, как использовать установленное соединение.



Привязка адреса к сокету


После того как вы подготовили структуру SOCKADDR , записав в нее параметры сокета (в частности, адрес), следует выполнить привязку адреса к сокету при помощи функции bind :

int bind ( SOCKET sock, const struct sockaddr FAR * addr, int namelen);

Параметр sock должен содержать дескриптор сокета, созданного функцией socket .

В поле addr следует записать указатель на подготовленную структуру SOCKADDR , а в поле namelen - размер этой структуры.

В случае ошибки функция bind возвращает значение SOCKET_ERROR . Дальнейший анализ причин ошибки следует выполнять при помощи функции WSAGetLastError . Возможные коды ошибок перечислены ниже:

Код ошибки Описание
WSANOTINITIALISED Перед использованием функции необходимо вызвать функцию WSAStartup
WSAENETDOWN Сбой в сети
WSAEADDRINUSE Указанный адрес уже используется
WSAEFAULT Значение параметра namelen меньше размера структуры sockaddr
WSAEINPROGRESS Выполняется блокирующая функция интерфейса Windows Sockets
WSAEAFNOSUPPORT Этот протокол не может работать с указанным семейством адресов
WSAEINVAL Сокет уже привязан к адресу
WSAENOBUFS Установлено слишком много соединений
WSAENOTSOCK Указанный в параметре дескриптор не является сокетом

Пример вызова функции bind показан ниже:

if(bind (srv_socket , (LPSOCKADDR )&srv_address, sizeof(srv_address)) == SOCKET_ERROR ) { closesocket (srv_socket); MessageBox(NULL, "bind Error", "Error", MB_OK); return; }



Проблемы с цветовыми палитрами и цветовым разрешением


Файлы многоцветных графических изображений часто содержат в себе цветовую палитру - специальным образом организованную таблицу цветов. Палитра используется интерфейсом графических устройств GDI операционной системы Microsoft Windows в режиме среднего цветового разрешения, когда одновременно могут отображаться не более 256 цветов.

Для того чтобы приложение правильно показывало изображения с палитрами в режиме среднего цветового разрешения, оно должно обрабатывать определенные сообщения, которые операционная система посылает ему при активизации главного окна приложения, а также при его вытеснении на задний план.

К сожалению, далеко не все приложения способны правильно работать с палитрами. Как это ни странно, ошибается даже текстовый процессор Microsoft Word for Windows, например, версии 2.0. Наиболее распространенная ошибка заключается в том, что приложение "забывает" загрузить свою палитру, после того как его главное окно было отодвинуто на задний план, а затем вновь активизировано. Внешне эта ошибка выражается в сильном искажении цветов графического изображения.

Несмотря на то, что современные видеоадаптеры работают, как правило, в режимах высокого цветового разрешения, когда одновременно могут отображаться примерно 64 тысячи или даже свыше 16 млн. цветов, некоторые пользователи работают в режиме низкого (16 цветов) или среднего (256 цветов) цветового разрешения.

Поэтому используйте многоцветные изображения с палитрами только в том случае, когда вы не можете обойтись 16 цветами, например, при публикации в документе HTML цветной фотографии.

Более подробно о том, как операционная система Microsoft Windows работает с палитрами, вы можете узнать из 14 тома нашей серии книг "Библиотека системного программиста", который называется "Графический интерфейс GDI в Microsoft Windows".



Проблемы с символами кириллицы


Если вы попробуете подготовить документ HTML с символами кириллицы с помощью текущей на момент написания этой книги версии редактора Microsoft Internet Assistant , то в выходном документе все символы кириллицы будут заменены на символьные объекты, которые мы описали раньше.

В результате параграф русского текста будет выглядеть следующим образом:

<P> &Iuml;&eth;&egrave;&igrave;&aring;&eth; &eth;&oacute;&ntilde;&ntilde;&ecirc;&icirc;&atilde;&icirc; &ograve;&aring;&ecirc;&ntilde;&ograve;&agrave;

Хотя внешне при просмотре страница будет выглядеть нормально, такое представление текста сильно увеличивает размер страницы и, как следствие, время ее загрузки. К сожалению, средство редактирования, встроенное в навигатор Netscape Navigator Gold версии 2.0 также не способно работать с символами кириллицы. Этот навигатор завершается аварийно с ообщением об ошибке при попытке сохранить созданный документ в файл.



Прочие команды


Если вы забыли команды программы FTP , воспользуйтесь командой help. Указав ей в качестве параметра имя любой команды, вы сможете посмотреть ее краткое описание. При вводе команды без параметров отображается полный список команд. Аналогичные действия выполняются по команде ?.

Командой bye вы можете воспользоваться для завершения работы программы FTP .

Что же касается команд пересылки файлов с локального компьютера на диски удаленного узла, создания каталогов, стирания и переименования файлов, а также каталогов на удаленном компьютере, то они обычно вам недоступны. Администратор никогда не разрешит любому пользователю выполнять подобные операции на своем сервере FTP .



Программа FTP для IBM OS/2 Warp Connect


Если вы работаете в среде операционной системы IBM OS/2 Warp Connect, вы тоже можете работать с программой FTP , запустив ее из папки TCP/IP Utilities. После запуска на экране появляется окно программы FTP и вы можете вводить в нем только что описанные команды (рис. 3.7).

Рис. 3.7. Программа FTP для IBM OS/2 Warp Connect



Программы для работы с протоколом FTP


Первое, что вы можете попробовать, подключившись к сети Internet, это воспользоваться программой FTP для того чтобы загрузить из Internet на диск своего компьютера другие приложения, специально ориентированные на работу с серверами FTP, WWW , а также предназначенные для работы с электронной почтой и конференциями.

Программа FTP есть в составе операционных систем Microsoft Windows 95 (при добавлении расширения Microsoft Plus) и Microsoft Windows NT, поэтому как только вы установите соединение с Internet, то сможете сразу ей воспользоваться.



Просмотр содержимого каталогов сервера


Для просмотра содержимого текущего каталога, расположенного на диске удаленного компьютера, воспользуйтесь командами dir или ls. Перемещаться по дереву каталогов удаленного узла вы сможете при помощи команды cd.



Просмотр страниц


Для перехода к просмотру других страниц вы можете либо сделать щелчок левой клавишей мыши по гиперсвязи (выделенному фрагменту текста или графическому изображению), либо набрать полный адрес URL новой страницы в поле Address, расположенному ниже линейки инструментальных средств, и нажать клавишу <Enter>. Последний способ предполагает, что вы знаете адрес нужной вам страницы.

В процессе загрузки новой страницы флаг оживает, так как вновь возобновляется процесс передачи данных по сети.

Заметим, что каждый раз, когда навигатор переходит к просмотру новой страницы WWW , он заново устанавливает соединение с сервером WWW, принимает данные и затем разрывает соединение. Если на загружаемой странице есть несколько графических изображений, то для загрузки каждого изображения повторяется цикл "соединение" - "передача данных" - "разрыв соединения".

После того как вы перешли к просмотру новой страницы, вы можете вернуться к старой, нажав кнопку с изображением треугольника, направленного острием влево.

Если загрузка страницы была выполнена полностью, она сразу появится на экране, так как навигатор сохраяет загруженные страницы на диске в кэше страниц (это просто каталог с файлами). В том случае когда вы не дождались окончания загрузки страницы и перешли к просмотру новой, при возвращении к просмотру предыдущей страницы последняя будет загружаться заново.

Кнопка с изображением треугольника, направленного острием вправо, предназначена для просмотра следующей страницы, записанной в кэше страниц.

Таким образом, если вы последовательно просматривали несколько страниц и каждая из них была загружена до конца, то с помощью двух только что описанных кнопок вы можете их просматривать без повторной загрузки данных из сети. Последнее обстоятельство позволит вам сэкономить немало времени.

Содержимое страниц периодически изменяется, поэтому время от времени их нужно обновлять в кэше.

Для повторной загрузки текущей отображаемой страницы вы можете нажать кнопку с изображением двух стрелок, показанную слева.
<
Мы уже говорили, что сразу после запуска навигатора он пытается загрузить домашнюю страницу, указанную в параметрах настройки.

С помощью кнопки с изображением домика вы в любой момент можете перейти к просмотру домашней страницы.
Кстати, раз уж речь зашла о кнопках, расположенных на инструментальной линейке, расскажем о назначении остальных кнопок.

Кнопка Назначение
Переход к просмотру страницы сервера сети Microsoft Network, на которой находятся многочисленные средства поиска информации в сети Internet
Работа с серверами электронных конференций
С помощью этой кнопки вы можете открыть папку Favorites, в которой находятся наиболее интересные для вас страницы. Для перехода к просмотра страницы из этой папки вам достаточно сделать двойной щелчок левой клавишей мыши по пиктограмме или названию нужной страницы
Если нажать на эту кнопку, на экране появится диалоговая панель, с помощью которой можно добавить текущую страницу в папку Favorites
Увеличение высоты шрифта, которым отображается содержимое страницы
Уменьшение высоты шрифта, которым отображается содержимое страницы
Операция удаления (работает только в режиме редактирования страниц)
Операция копирования в универсальный буфер обмена Clipboard
Операция вставки содержимого Clipboard (работает только в режиме редактирования страниц)
Переход в режим редактирования страницы. Отредактированную страницу можно сохранить в файле на локальном диске
С помощью этой пиктограммы вы можете открыть любую страницу, расположенную на любом удаленном сервере WWW либо на локальном диске
Печать текущей страницы
Отправка электронного письма
Навигатор Microsoft Internet Explorer, как и другие навигаторы, может быть использован для работы с серверами FTP.

Для подключения к такому серверу в поле Address необходимо вместо адреса сервера WWW указать адрес сервера FTP, например так:

http://ftp.microsoft.com

На экране появится страница, на которой изображено содержимое каталогов сервера FTP в виде папок. Для просмотра папки достаточно сделать по ней двойной щелчок левой клавишей мыши. После этого вы увидите новую страницу с содержимым каталога.

Чтобы загрузить нужный файл, вы должны сделать двойной щелчок по пиктограмме файла. На экране появится диалоговая панель, с помощью которой вы сможете сохранить файл на локальном диске в выбранном вами каталоге.


Протоколы SLIP и PPP


Протоколы SLIP (Serial Line Internet Protocol ) и PPP (Point to Point Protocol ) специально предназначены для создания соединения с использованием протокола TCP/IP через телефонные линии.

Протокол SLIP появился первым и сейчас не рекомендуется к использованию. Этот протокол обладает рядом недостатков. Например, перед установкой соединения через протокол SLIP оба узла должны знать свои адреса IP. Другой недостаток - протокол SLIP не предусматривает коррекции ошибок, возникающих при передаче данных по телефонному каналу.

Протокол PPP более совершенный. Он лишен указанных выше недостатков и дополнительно имеет много преимуществ. Например, в отличие от SLIP, он может служить носителем для других протоколов, причем разные протоколы могут использоваться одновременно. Так как протокол PPP предусматривает автоматическое конфигурирование соединяемых узлов, его настройка очень проста. Кроме того, при случайном разрыве соединения протокол PPP может его восстановить.

В нашей книге мы научим вас устанавливать соединение с узлами поставщиков сервиса Internet с использованием протокола PPP.



Работа с базами данных


Строка SWAIS - Full Screen Database Browser в меню INTERNET SERVICES позволит вам работать с различными базами данных, доступными из сети GlasNet.

Ниже показано меню, которое появляется на экране при выборе указанной строки:

------------------------------------------------------- G l a s N e t D a t a b a s e s ------------------------------------------------------- [1] Directories [2] Bibliographies & Library Catalogs [3] Miscellaneous Resources

Select a number (? for help, or q to quit):

Каждая строка этого меню открывает доступ к спискам различных каталогов и библиотек. Путешествуя по дереву списков, вы можете выбрать нужную вам базу данных.



Работа с электронной почтой


Для начала отправим самим себе небольшое текстовое сообщение, аналогичное тому, что мы отправляли в текстовом режиме. На этот раз мы воспользуемся приложением Eudora Light , которое входит в комплект программ GlasInterACT.

Запустите приложение GlasInterACT и нажмите кнопку Mail (рис. 1.18). После ввода пароля на экране появится главное окно программы Eudora Light (рис. 1.4). Заметьте, что соединение с сервером GlasNet пока не установлено, так что можно работать с почтой в автономном режиме.

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

Сразу после этого в главном окне программы появится бланк, который нужно заполнить так, как это показано на рис. 1.26.

Рис. 1.26. Подготовка нового сообщения

Вы должны указать адрес получателя почты в поле To, описать краткое содержимое письма в поле Subject, и ввести текст письма под горизонтальной чертой. Другие поля этой формы нас пока не интересуют.

После этого нажмите кнопку Queue, и ваше письмо будет записано в очередь на отправку. При этом оно появится в папке Out, изображенной на рис. 1.26 в минимизированном виде.

Для того чтобы все подготовленные письма были отправлены, выберите из меню File строку Send Queued Messages или просто нажмите комбинацию клавиш <Ctrl+T>. Программа приступит к установке соединения с сервером и передаст почту. В процессе передачи в отдельном окне вы увидите различные сообщения, которые можно игнорировать.

После завершения передачи вам будет предложено отключиться от сети (рис. 1.27).

Рис. 1.27. Диалоговая панель с запросом на отключение от сети

Если посылка почты - это все, что вы собирались сделать, нажмите кнопку Yes. После этого связь будет разорвана. В нашем случае можно поступить именно так.

Теперь займемся получением почты.

Выберите из меню File строку Check Mail или нажмите комбинацию клавиш <Ctrl+M>. Приложение соединится с почтовым сервером и, запросив пароль, заберет почту (если она есть). После этого почта будет удалена из вашего ящика, расположенного на сервере GlasNet.


При наличии новой почты на экране появися сообщение, показанное на рис. 1.28.



Рис. 1.28. Сообщение, которое появляется на экране, если вы получили новую почту

Новая почта появится в папке In и будет отмечена жирной точкой, как это показано на рис. 1.29.



Рис. 1.29. Получена новая почта

Для просмотра новой почты достаточно сделать двойной щелчок левой клавишей мыши по соответствующей строке в папке In. После этого содержимое письма будет показано в отдельном окне (рис. 1.30).



Рис. 1.30. Просмотр содержимого письма

Содержимое письма можно сохранить в файле или распечатать на принтере.

Как видите, работать с почтой, пользуясь программой Eudora Light, намного удобнее, чем делать это в текстовом режиме через терминальную программу.


Работа с электронными конференциями


При подключении к сети Internet через протокол TCP/IP вы можете воспользоваться удобными программами, предоставляющими доступ к серверам конференций в реальном режиме. При этом вам не нужно подписываться на конференции и получать статьи по почте, так как вы можете сразу просмотреть заголовки статей на экране и переписать к себе на диск нужные вам статьи.

Нам очень понравилась приложение News Express , предназначенное для интерактивного просмотра конференций, которое можно бесплатно получить из сети. После запуска на экране в окне Newsgroups (рис. 1.33) появляется список конференций (в котором перечислено несколько тысяч конференций на всевозможные темы).

Рис. 1.33. Главное окно приложения News Express

При первом подключении к серверу конференций загрузка списка конференций может занять несколько минут, однако в дальнейшем вы можете загружать такой список только время от времени.

Выбрав нужную вам тему, ориентируясь на ее название, сделайте двойной щелчок левой клавишей мыши по соответствующей строке. На экране появится новое окно, которое постепенно заполнится списком статей из выбранной конференции. На рис. 1.33 это окно показано на переднем плане.

Щелчком левой клавишей мыши по любому столбцу в окне просмотра названий статей вы легко сможете выполнить сортировку по теме, дате, имени автора статьи или по размеру статьи.

Для просмотра статьи вам достаточно сделать двойной щелчок левой клавишей мыши по ее заголовку. Содержимое статьи будет показано в отдельном окне (рис. 1.34).

Рис. 1.34. Просмотр содержимого выбранной статьи

Пользуясь одной из кнопок в инструментальной панели вы легко сможете послать в конференцию ответ на прочитанную статью или поместить туда новую статью.


Учтите, что список конференций очень большой (в нем несколько тысяч названий), поэтому при самом первом подключении к серверу конференций процесс загрузки этого списка может отнять у вас несколько минут.

Кнопка Описание
Посылка новой статьи в электронную конференцию
Посылка нового почтового сообщения
Посылка ответа на почтовое сообщение
Посылка ответа на статью в электронной конференции
Посылка сообщения и ответа одновременно
Передача сообщения другому корреспонденту
Просмотр предыдущей непрочитанной статьи
Просмотр следующей непрочитанной статьи
С помощью этой кнопки можно отметить статью как прочитанную
С помощью этой кнопки можно отметить все статьи как прочитанные
Печать содержимого текущей отображаемой статьи
Отмена процесса передачи данных

Работа с навигатором Microsoft Internet Explorer


Навигатор Microsoft Internet Explorer устанавливается вместе с расширением Microsoft Plus, которое предназначено для операционной системы Microsoft Windows 95.



Работа с серверами WWW


На серверах WWW хранятся страницы мультимедийной информации (которые для сокращения мы будем называть страницами WWW), объединенные и систематизированные с использованием гиперсвязей, напоминающих гипертекстовые ссылки в электронных справочных системах для Microsoft Windows.

Страницы WWW могут содержать помимо текстовой графическую информацию, звук, а также видео. Очевидно, текстовый режим просмотра не очень подходит для работы с такими страницами, хотя кое-что вы все же сможете увидеть.

Тем не менее, давайте выберем из меню INTERNET SERVICES строку "Lynx - Text based WWW browser". На экране появится предложение ввести так называемый адрес URL нужного вам сервера WWW:

Specify the site you want to connect to, for example: URL: http://www.glasnet.ru URL:

Каждый сервер WWW имеет свой адрес. Позже мы научим вас ориентироваться в этих адресах, а пока введите строку, показанную ниже:

URL: http://www.microsoft.com

Через некоторое время на экране появится первая часть страницы сервера WWW фирмы Microsoft:

Microsoft Corporation (p1 of 3) Where do you want to go today? What's New Search Index FAQ Help Feedback Products Support For Developers Only Partners &amp; Solutions Internet Resource Center Visit MSN Visit Microsoft

Welcome to Microsoft The worldwide leader in software for PCs.

Black Entertainment Television and Microsoft Announce New Alliance BET Holdings Inc. and Microsoft Corp. announced today that they will launch a joint venture to form a new company that offers Internet online programming, interactive television and CD-ROM titles. The goal is to create the premier brand for African-American consumers on the Internet.

-press space for more, use arrow keys to move, '?' for help, 'q' to quit

Arrow keys: Up and Down to move. Right to follow a link; Left to go back. H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list

Передвигаясь по полям страницы с помощью клавиш перемещения курсора по вертикали вы можете выбрать интересующий вас раздел. Для перехода к просмотру раздела нажмите клавишу перемещения курсора вправо, для возврата к просмотру предыдущего раздела - клавишу перемещения курсора влево. С помощью клавиши пробела вы сможете просмотреть содержимое всей страницы.

Конечно, в графическом режиме страницы WWW выглядят намного привлекательнее, но передача графики через медленный модем отнимает слишком много времени. Поэтому реально вы сможете работать в графическом режиме только в том случае, если ваш модем способен передавать данные со скоростью не менее 9600 bps.

Итак, продолжим описание строк меню INTERNET SERVICES.


Для того чтобы приступить к работе с серверами WWW, вы должны установить соединение с Internet по протоколу TCP/IP. К сожалению, на момент написания книги в состав комплекта GlasInterACT не входил навигатор WWW, однако вы можете воспользоваться любым из имеющихся, получив их, например, из сети Internet с помощью протокола FTP.

Если установить соединение с помощью средств Dial-Up Networking , входящих в состав Microsoft Windows 95, то вы сможете использовать для просмотра серверов WWW такие навигаторы, как Microsoft Internet Explorer , Netscape Navigator или Mosaic . Первый из них входит в состав пакета программ Microsoft Plus , остальные можно получить из сети Internet.

Установив соединение с Internet, просто запустите имеющийся у вас навигатор и начинайте работать.



Работа с записной книжкой


Как мы уже говорили, сразу после установки приложения Remote Access записная книжка, хранящая параметры соединений с удаленными узлами, пуста. Ее необходимо заполнить, чем мы сейчас и займемся.

В главном окне приложения Remote Access (рис. 2.41) нажмите кнопку Add. На экране появится диалоговая панель Add Phone Book Entry, показанная на рис. 2.43.

Рис. 2.43. Диалоговая панель Add Phone Book Entry, предназначенная для добавления нового соединения в записную книжку

В поле Entry Name введите название соединения.

Поле Phone Number позволяет указать список телефонных номеров, по которым нужно дозваниваться для установки соединения. Так как организация, предоставляющая услуги Internet, обычно имеет несколько телефонных номеров для соединения, вы можете указать в этом поле все известные вам номера.

Для того чтобы указать список дополнительных телефонных номеров, нажмите кнопку, расположенную в правой части поля Phone Number.

При этом вы увидите диалоговую панель Phone Numbers for, показанную на рис. 2.44.

Рис. 2.44. Диалоговая панель Phone Numbers for, предназначенная для добавления дополнительных телефонных номеров

Набрав номер в поле New Phone Number, нажмите кнопку Add. Введенный вами номер появится в списке Phone Numbers. Для того чтобы изменить любой номер из этого списка, его нужно выделить, набрать новое значение и нажать кнопку Replace.

С помощью кнопок Raise, Lower и Delete вы можете, соответственно, либо перемещать номера по списку вверх или вниз, либо удалять из списка.

С помощью кнопки Modem в диалоговой панели Add Phone Book Entry вы можете настоить параметры последовательного порта, к которому подключен модем.

В большинстве случаев вам подойдут значения, принятые по умолчанию, однако нужно проследить, чтобы скорость передачи данных через порт не была слишком низкой. Нужное значение скорости вы можете определить из документации, которая поставляется вместе с модемом.

На следующем этапе вам нужно настроить для нового соединения параметры сетевого протокола. Для этого в диалоговой панели Add Phone Book Entry нажмите кнопку Network. На экране появится диалоговая панель Network Protocol Settings (рис. 2.45).




Рис. 2.45. Диалоговая панель Network Protocol Settings

В этой панели вам нужно включить переключатели PPP, TCP/IP и Request LCP extensions, а затем для настройки параметров протокола TCP/IP нажать кнопку TCP/IP Settings.

Сразу после этого на экране появится диалоговая панель PPP TCP/IP Settings, показанная на рис. 2.46.



Рис. 2.46. Диалоговая панель PPP TCP/IP Settings

Если ваш компьютер имеет постоянный адрес IP, включите переключатель Require specific IP address и укажите этот адрес в поле IP address. Если же вы получаете адрес IP динамически при подключении к узлу поставщика услуг Internet, оставьте включенным переключатель Server assigned IP Address (именно так следует поступить при работе с серверами сети GlasNet).

Далее включите переключатель Use specific name server addresses. В полях DNS и DNS backup укажите адреса основного и запасного серверов доменных имен, полученные у поставщика услуг Internet. Оставьте также включенными переключатели Use VJ header compression (сжатие заголовков) и Use default gateway on remote network (использование принятого по умолчанию моста в удаленную сеть).

Теперь в диалоговой панели Add Phone Book Entry (рис. 2.43) нажмите кнопку Security. На экране появится диалоговая панель Security Settings, показанная на рис. 2.47.



Рис. 2.47. Диалоговая панель Security Settings

Эта панель используется для определения способа идентификации пользователя, подключаемого к удаленному узлу. Вначале мы будем работать с окном терминальной программы, которая позволяет ввести имя и пароль пользователя вручную, затем научимся создавать файлы сценариев для автоматизации процесса подключения.

Итак, включите в диалоговой панели Security Settings переключатель Use clear text Terminal login only. В списке Before dialing выберите строку (none), а в списке After dialing - строку Terminal (как это показано на рис. 2.47). Затем нажмите кнопку OK.

На следующем этапе необходимо проверить привязку протоколов.

Для этого запустите приложение Control Panel и сделайте двойной щелчок левой клавишей мыши по пиктограмме Network. На экране появится диалоговая панель Network Settings. Нажмите в этой диалоговой панели кнопку Bindings. На экране появится диалоговая панель Network Bindings.

Выберите в списке Show Bindings for строку TCP/IP Protocol. Убедитесь, что этот протокол привязан так, как это показано на рис. 2.48.



Рис. 2.48. Проверка привязки протокола TCP/IP

На рис. 2.49 показана привязка сервиса рабочей станции Workstation.



Рис. 2.49. Проверка привязки сервиса рабочей станции Workstation


Работа в текстовом режиме


На первом этапе вы должны подключиться к серверу GlasNet. В нашем примере мы воспользуемся терминальной программой

Hyper Access, которая входит в состав

Microsoft Windows 95. При этом на сервере GlasNet

с нами будет работать другая программа, специально предназначенная для того, чтобы вести диалог с пользователем. Фирмы, обеспечивающие доступ к Internet через терминальные программы, могут предоставить вам также консоль операционной системы UNIX . Не будем спорить, что удобнее, а перейдем к делу (на наш взгляд удобнее прямое соединение с Internet по протоколу TCP/IP, о чем мы еще расскажем).



Расширение списка серверов FTP


Для того чтобы добавить новый сервер FTP в список Profile Name, расположеный в диалоговой панели Session Profile (рис. 3.8), вы должны нажать кнопку New, которая находится в указанной диалоговой панели.

Далее вы должны заполнить поля диалоговой панели так, как это сделано для других серверов FTP , имеющихся в списке.

В поле Host Name следует указать доменное имя сервера или его адрес IP в виде четырех десятичных чисел, разделенных точками.

Далее вам нужно включить переключатлеь Anonymous Login. При этом поля User ID (идентификатор пользователя) и Password (пароль) будут заполнены автоматически. При необходимости вы можете изменить содержимое указанных полей.

В группе органов управления Initial Directories можно задать пути к локальному и удаленному каталогу, которые будут текущими после установки соединения.

Сделав все изменения, нажмите кнопку Save. Список Profile Name будет дополнен.



Разговор через Internet в реальном времени


Хотите поговорить с кем нибудь через Internet?

Нет никаких проблем. В сети существуют специальные серверы, позволяющие вам сделать это. На этих серверах организуется несколько электронных конференций, работающих в реальном времени.

К каждой такой конференции может подключиться различное количество участников - от двух до полутора десятков. В процессе работы вы видите сообщения, посылаемые участниками конференции и можете посылать свои сообщения (сразу всем участникам или только некоторым из них).

Конечно, такой разговор менее удобен, чем разговор по международному телефону, однако заметим, что во-первых, разговор через Internet обойдется вам намного дешевле, а во-вторых, вы получите совсем другие ощущения. Лучше попробуйте сами.



Редактор Microsoft Internet Assistant


Как мы уже говорили, фирма Microsoft выпустила для своего текстового процессора Microsoft Word for Windows расширение Microsoft Internet Assistant , с помощью которого вы можете легко создавать собственные страницы WWW.

Это расширеное особенно удобно для тех, кто уже умеет работать в среде указанного текстового процессора. Если же приложение Microsoft Word for Windows вам незнакомо, вы можете быстро научиться с ним работать, воспользовавшись первым томом нашей серии книг "Персональный компьютер. Шаг за шагом", который называется "Введение в MS-DOS, MS Windows, MS Word for Windows". Потратив неделю-другую на изучение текстового процессора Microsoft Word for Windows, вы сэкономите гораздо больше времени при подготовке документов в режиме WYSIWYG, когда на экране отображается то, что получится при распечатке на принтере.

Редактор страниц Microsoft Internet Assistant представляет собой набор макрокоманд и стиль, на базе которого создаются документы HTML , причем создаются в режиме WYSIWYG.



Редактор Netscape Navigator Gold


В заключение этой главы мы совсем коротко расскажем о редакторе документов HTML , встроенном в навигатор Netscape Navigator Gold .

Главное окно этого редактора показано на рис. 4.17.

Рис. 4.17. Главное окно редактора документов HTML , встроенного в навигатор Netscape Navigator Gold

Бросив беглый взгляд на инструментальную линейку этого редактора, нетрудно заметить сходство изображенных на нем кнопок с аналогичными по назначению кнопками редактора Microsoft Internet Assistant for Microsoft Word, описанного в предыдущем разделе. Поэтому для экономии места мы не будем приводить подробное описание инструментальных линеек - вы сумеете разобраться с ними самостоятельно.

Обратите внимание, что размер текста указан в относительных единицах, а не в абсолютных, как это было в окне редактора Microsoft Internet Assistant .

Для того чтобы определить параметры документа, такие как заголовок, оформление страницы, цвет фона и цвет текста, вы должны выбрать из меню Properties строку Document. После этого на экране появится блокнот, на страницы которого вы должны занести всю необходимую информацию.

Когда вы нажимаете кнопку вставки графического изобарежния, на экране появляется диалоговая панель, показанная на рис. 4.18.

Рис. 4.18. Диалоговая панель Insert Image

В поле Image File Name вы должны указать путь к файлу, содержащему изображение. Для поиска файла можно воспользоваться кнопкой Browse.

В поле Image вы можете указать путь к файлу альтернативного изображения. Поле Text позволяет вам указать текст, котороый будет на месте рисунка, если графика недоступна.

Список Alignment позволяет указать выравнование текста относительно графики, причем в окне Preview сразу отображается полученный результат.

Редактор Netscape Navigator Gold содержит также средства для работы с языком JAVA (консоль JAVA), однако в нашей книге мы не будем рассматривать этот язык.