Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Установка обработчика сетевых ошибок




Пересылка файла по сети

Напишите самостоятельно программы (листинги 8, 9), пересылающую и, соответственно, принимающую двоичный файл с одного компьютера на другой (для тренировки вначале напишите программу, которая пересылает файл на одном и том же компьютере,но в другой каталог, используя механизм сокетов). Для чтения и записи двоичных (т. е. не обязательно текстовых) файлов есть функции

int fread(void * Buffer, int Size, int Count, FILE * F)

int fwrite(void * Buffer, int Size, int Count, FILE * F)

Пусть файл передаётся от сервера к клиенту (т.е. клиент скачивает файл). Тогда алгоритм работы будет примерно следующий: сервер в цикле считывает файл кусками (например, по 1024 байта) и отправляет клиенту сообщения такого формата:

Размер i-го куска (4 байта) i-й кусок файла (£ 1024 байт)

Клиент же записывает эти куски последовательно себе на диск в какой-нибудь файл, а после записи очередного куска отправляет подтверждение серверу. Сервер же в это время ждёт подтверждения, и когда оно приходит, посылает очередной кусок файла. Подтверждения нужны не для того, чтобы гарантировать доставку данных, а для того, чтобы в сети не произошло.затора. из пакетов. Запись на диск _ медленная операция (по крайней мере, медленнее, чем чтение), и может получиться так, что клиент не будет успевать сливать воду из трубы-сокета.. Для маленьких файлов это будет незаметно, а вот при попытке переслать файл мегабайт на десять могут начаться всякие проблемы...

 

Прежде всего, нужно помнить, что, несмотря на всякие гарантии доставки пакетов, любая сеть очень ненадёжна по своей природе. В самом деле, что будет, если злоумышленник перережет провод, по которому передается информация государственной важности, а мы об этом ничего не узнаем? Нам нужно уметь контролировать сетевые ошибки. Для этого существует функция signal, устанавливающая функцию-обработчик на определённый тип события (в нашем случае разрыв соединения). Это делается в самом начале программы так:

if (signal(SIGPIPE, &SigHandler) == SIG_ERR)

{ fprintf(stderr, "Error: cannot set signal handler!\n"); return 0; }

Здесь SigHandler _ функция такого вида: void SigHandler(int SigID), а системная константа SIGPIPE указывает на тип обрабатываемой ошибки. Внутри обработчика нужно как-то сообщить пользователю о том, что соединение накрылось, и завершить программу.

Эта функция должна быть реализована в программах клиент-сервер (листинги 8, 9).

 

Прорыв за пределы платформы

В мире Internet взаимодействие программ, работающих на разных платформах, встречается сплошь и рядом. Так, практически ежесекундно очередной Internet Explorer подсоединяется к веб-серверу Apache, а очередной Netscape Navigator совершенно спокойно подключается к IIS. Вот почему весьма полезно писать программы так, чтобы их можно было без труда переносить на другие платформы. В этом разделе мы посмотрим, как переносить Linux-программы, использующие сокеты, на платформу Windows.

Список основных отличий socket API и Winsock API выглядит примерно так.

В Windows набор заголовочных файлов существенно уменьшен. Собственно говоря, вам нужно включить всего один файл winsock.h (или winsock2.h, если вы хотите использовать расширенные возможности Winsock 2).

В Windows библиотеку Winsock необходимо явно проинициализировать до обращения к любым другим функциям из неё. Это делается с помощью функции WSAStartup. Кроме того, существует функция WSACleanup, которую следует вызывать по завершении работы с сокетами.

Как мы знаем, в Linux дескрипторы сокетов имеют тип int. В Windows сокеты не являются файловыми дескрипторами, поэтому для них введён свой тип SOCKET. Хотя этот тип и объявлен как u_int, полагаться на это в программе не следует.

В Windows для работы с сокетами не используются функции файлового ввода/вывода (read и write). Вместо close используется closesocket.

В Windows глобальная переменная errno не используется. Вместо этого код последней ошибки сохраняется системой для каждого потока отдельно. Чтобы его получить, используется функция WSAGetLastError.

В Windows введены дополнительные константы, которые следует применять вместо конкретных чисел. Так, значения, возвращаемые функциями Winsock, следует сравнивать с константами INVALID_SOCKET или SOCKET_ERROR, а не с -1.

Если переписать наш эхо-клиент с учётом приведённых особенностей Winsock API, а затем скомпилировать его под Windows (например, с помощью Visual C++), он вполне сможет взаимодействовать с эхо-сервером, работающим под Linux. Таким образом, сокеты позволяют решить проблему кроссплатформенного взаимодействия двух приложений.

К сожалению, различия socket API и Winsock не ограничиваются приведённым списком. При портировании более сложных, "продвинутых" программ начинают возникать более принципиальные проблемы. Например, под Windows существуют ограничения в поддержке низкоуровневых сокетов (они впервые появились в спецификации Winsock 2, а возможность напрямую манипулировать IP-заголовками доступна только под Windows 2000). Кроме того, проблемы могут возникнуть с функциями, не имеющими прямого отношения к socket API. Так, в Windows нет прямого аналога функции fork, и для организации параллельного обслуживания клиентов придётся прибегнуть к другим средствам.

 

 




Поделиться с друзьями:


Дата добавления: 2017-02-01; Просмотров: 40; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopediasu.com - Студопедия (2013 - 2026) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.