..:: Новый софт ::.. ..:: Гостевая ::.. ..:: Форум ::.. ..:: ТОП сайтов ::.. ..:: Обратная связь ::.. ..:: Как добавить новость? ::..
Скачать Бесплатно Софт, Фильмы, Музыка, Игры, Программы
Меню сайта
Язык | Language
перевод на английский


Отправка СМС на мобильный
Категории новостей
Софт/Осмотр [4]
программы - полное описание функцию, статьи о программном софте
Интернет [15]
Все про инет
Фильмы [2]
Музыка [1]
Работа [9]
Все про работу в повседневной жизни и интернете.
Web-мир [2]
Помощь сайтостроителю. Вся новая информация про сайты.
Компьютер [5]
Общество и политика [2]
Жизнь среди нас, окружающие.
Ucoz [1]
Все про систему в этом разделе.
Отдых [0]
Все про отдых.
Религия [2]
Все про религию. Вопросы, обсуждения.
Спорт [1]
Новости [1]
Мобильные телефоны [0]
Медицина [3]
Разное [4]
Сюда, если не подходит не 1 из разделов.
Новое на форуме
Голосование
На какой файлообменник загружать файлы для скачки?

Результат опроса Результаты Все опросы нашего сайта Архив опросов

Всего голосовало: 1073
Обсудить опрос на форуме
Новинки на сайте
Сегодня материалов нет.
Рекламный блок
Свободно, писать в ICQ 5429888

Тут был =) сапы



Последние комментарии:
» Новость:

goga111 оповестил:

ссылк

» Новость:

goga111 оповестил:

ссылк

» Новость:

goga111 оповестил:

ссылк

» Новость:

goga111 оповестил:

ссылк

» Новость:

goga111 оповестил:

ccылк

» Новость:

goga111 оповестил:

ccылк

» Новость:

goga111 оповестил:

ccылк

» Новость:

goga111 оповестил:

ccылк

» Новость:

goga111 оповестил:

ccылк

» Новость:

goga111 оповестил:

ссылк

Статистика
Зарег. на сайте
Всего: 32689
Новых за месяц: 173
Новых за неделю: 44
Новых вчера: 10
Новых сегодня: 5
Из них
Администраторов: 1
Модераторов: 2
Журналистов: 54
Обычных юзеров: 32631
Из них
Парней: 32085
Девушек: 256


Rambler's Top100


Яндекс.Метрика

Онлайн всего: 2
Гостей: 1
Пользователей: 1
jonirv16
Реклама
Место для рекламы, сдается, писать в ICQ 5429888 или в ЛС DiviProUT

Главная » Статьи » Компьютер

Структура сетевого приложения на примере загрузки файла с веб-сервера

Структура сетевого приложения на примере загрузки файла с веб-сервера


В статье рассматривается соответствие сетевых программных инетерфейсов модели OSI. Также подробно разбирается структура клиентского HTTP-приложения, написанного с помощью интерфейса WinSock. Статья будет полезна как программистам, так и обычным пользователям, интересующимся работой компьютерных сетей

В настоящее время существует много библиотек высокого уровня, которые позволяют программистам манипулировать сетевыми функциями. Приложения, которые их используют, в основном обращаются к интерфейсам прикладного уровня ОС (например WinHTPP в MS Windows). Однако для понимания принципов работы сети необходимо знать как все работает и на более низких уровнях. Канальный и сетевой уровни обычно реализуются аппаратно, и особого интереса не представляют. В данной статье я опишу сетевое приложение, обращающееся непосредственно к модулям транспортного уровня ОС.
Транспортный уровень - уровень модели OSI, который отвечает за доставку данных от одного приложения к другому с заданным уровнем надежности. Этот уровень особенно интересует программистов. Существует две модели транспортного уровня - датаграммнаяпередача и передача с установлением соединения. Датаграммы - небольшого размера сообщения (обычно служебные), которыми обмениваются приложения. Например протокол DNS использует датаграммы. И протокол DHT (в файлообменных сетях) тоже их использует. Но при передаче датаграмм невозможно восстановление поврежденных данных, поэтому при передаче файлов их не используют. Техника передачи с установлением соединения используется в протоколах HTTP, FTP, BitTorrent и др. Суть ее в том, что узлы перед процессом передачи данных устанавливают соединение, а в процессе передачи потерянные пакеты восстанавливаются. Вся прелесть этой техники в том, что программист может не париться, как именно пакеты восстанавливаются: важно то, что все пакеты дойдут именно в нужной последовательности (кроме случаев разрыва соединения). В стеке TCP/IP протокол TCP реализует эту технику.
Программный интерфейс транспортного уровня называется sockets (Он есть в разных системах, конкретно для Windows это Winsock). Этот интерфейс предоставляет программистам функции, которые работают независимо от протоколов и сетевого оборудования (даже от системы адресации). И это круто! Например функции getaddrinfo можно передать как доменное имя, так и NetBIOS имя компьютера - и все будет одинаково работать. В принципе процесс передачи данных через протоколы разной технологии почти не отличается в Winsock - например в протоколе UDP можно вызвать функцию connect , хотя реально соединение не устанавливается. Вместе с тем можно писать приложения ориентируясь и на конкрентный протокол. Словом, этот интерфейс очень гибкий. Но написание приложений в его среде довольно сложно. Поэтому на практике часто применяются другие интерфейсы. Но мы рассмотрим его с теоретической точки зрения, чтобы увидеть "внутренности" работы сетевых приложений.
Приложение WinSock тебует подключения библиотеки импорта ws2_32.lib (Это в среде разработки VisualStudio). Функции WinSock хранятся в библитеке ws2_32.dll .

Далее разбирается приложение, загружающее файл с веб-сервера по протоколу HTTP и отображающее его в экране консоли. Точнее оно отображает полный ответ сервера, включая заголовок. Интерес этого приложения также в том, что оно позволяет увидеть "своими глазами" ответы сервера, которые обычно скрыты.
В начале приложения мы включаем заголовочные файлы.
Code

#include <winsock2.h>  
  #include <ws2tcpip.h>  
  #include <stdio.h>  
  #include <stdlib.h>


Объявление переменных:
Code

WSADATA wsaData; //для инициализации сетевой подсистемы  
  char rq[]=//строка с запросом  
  "GET / HTTP/1.1\r\n\  
  Host: ya.ru\r\n\  
  User-Agent: Mozilla/4.05 (WinNT; 1)\r\n\  
  Accept: */*\r\n\r\n\  
  ";  
  char buf[5000]="";//переменная для хранения ответа сервера


Здесь в строковой константе задан HTTP-запрос GET. Путь к документу обозначен "/", что значит главную страницу сайта. В качестве параметров задается версия протокола, имя узла, браузер - на всякий случай говорим что мы Mozilla Firefox. Параметр Accept: */* задает что мы принимаем любой тип данных.

Теперь сама точка входа:
Code

int main()  
  {  
  int iResult;  
  struct addrinfo *result = NULL;  
  struct addrinfo hints;  
  SOCKET ConnectSocket = INVALID_SOCKET;  

  // Initialize Winsock  
  iResult = WSAStartup(MAKEWORD(2,2), &wsaData);  
  if (iResult != 0) {  
  printf("WSAStartup failed: %d\n", iResult);  
  system("PAUSE");  
  return 1;  
  }  
  ZeroMemory( &hints, sizeof(hints) );  
  hints.ai_family = AF_UNSPEC; //любое семейство адресов  
  hints.ai_socktype = SOCK_STREAM;//тип сокета  
  hints.ai_protocol = IPPROTO_TCP;//протокол TCP  
  iResult = getaddrinfo("ya.ru", "http", &hints, &result);//разрешение доменного имени  
  if (iResult != 0) {  
  printf("getaddrinfo failed: %d\n", iResult);  
  system("PAUSE");  
  WSACleanup();  
  return 1;  
  }


В данной части происходит инициализация сетевой подсистемы, а затем разрешение доменного имени узла - в нашем случае "ya.ru" - в сетевой адрес. На этом этапе происходит запрос к DNS-серверу. В структуре hints мы задаем желаемые требования - семейство адресов Ipv4, Ipv6 или любое; тип сокета - для нашего случая это сокет-поток, который соответствует протоколу TCP (для других протколов мог быть тип датаграмного сокета). Ну и задаем непосредственно протокол. Хотя это параметры необязательные - и так наверно все будет работать! У функции getaddrinfo второй параметр - номер порта или проткола, у нас "http", стандартный поpт 80. От DNS-сервера нам приходит IP-адрес сервера ( вс перемнной result), и теперь мы готовы соединится с ним. Для соединения мы создаем специальный объект - сокет. Фактически это набор ресурсов, связанных с сетевым соединением.
Code

ConnectSocket=socket(result->ai_family,result->ai_socktype,result->ai_protocol);//создание сокета  

  if (ConnectSocket == INVALID_SOCKET) {  
  printf("Error at socket(): %ld\n", WSAGetLastError());  
  system("PAUSE");  
  freeaddrinfo(result);  
  WSACleanup();  
  return 1;  
  }  
  iResult=connect(ConnectSocket,result->ai_addr,(int)result->ai_addrlen); //соединение с сервером  
  if (iResult == SOCKET_ERROR) {  
  iResult=WSAGetLastError();  
  printf("\nConnect error: %i\n",iResult);  
  system("PAUSE");  
  closesocket(ConnectSocket);  
  ConnectSocket = INVALID_SOCKET;  
  }  
  freeaddrinfo(result);//информация об адресе нам больше не нужна



Вот мы соединились с сервером. Теперь посылаем запрос.

Code

// Send an initial buffer  
  iResult = send(ConnectSocket, rq, (int) strlen(rq), 0);  
  if (iResult == SOCKET_ERROR) {  
  printf("send failed: %d\n", WSAGetLastError());  
  system("PAUSE");  
  closesocket(ConnectSocket);  
  WSACleanup();  
  return 1;  
  }  
  printf("\nSending a request - bytes Sent: %ld\n", iResult);  
  // shutdown the connection for sending since no more data will be sent  
  // the client can still use the ConnectSocket for receiving data  
  iResult = shutdown(ConnectSocket, SD_SEND);  
  if (iResult == SOCKET_ERROR) {  
  printf("shutdown failed: %d\n", WSAGetLastError());  
  system("PAUSE");  
  closesocket(ConnectSocket);  
  WSACleanup();  
  return 1;  
  }


Функцией shutdown мы сигнализируем серверу, что посылка данных завершена, и мы ждем ответа. Ее вызов можно опустить (иногда он даже вреден). Теперь мы получаем ответ порциями по 5 кб и выводим на экран. Когда сервер закрывает соединение, выходим из цикла.

Code

do {  
  iResult = recv(ConnectSocket, buf, 5000, 0);//прием данных  
  if (iResult > 0){ //данные успешно приняты  
  //Start receiving answer  
  printf("Server Answered.Bytes received: %d\n\n", iResult);  
   
  printf("%s",buf);  
  system("PAUSE");  
   
  }  
  else if (iResult == 0) //соединение закрыто сервером  
  printf("Connection closed\n");  
   
  else //произошла ошибка  
  printf("recv failed: %d\n", WSAGetLastError());  
  } while (iResult > 0);  

  system("PAUSE");  
  return 0;  
  }  


Вот пример ответа сервера (для mail.ru). Обратите внимание на странность - сервер возвращает код ошибки 404, но описание - ОК.



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

Источник: http://softforum.zbord.ru/viewtopic.php?t=16
Категория:

Компьютер

| Добавил: VadimTagil (17 Февраля 2012) | Автор: VadimTagil E W
Просмотров: 1050 | Рейтинг: 0.0/0
Гипер-ссылка на источник нашего сайта
HTML ссылка новости
BB-Code ссылка новости
Прямая ссылка

Важное инфо:
При добавлении коммента, соблюдайте указанным правилам:
1. Не рекламируйте, другие сайты без надобности
2. Не ругайтесь (мат). Постарайтесь объяснить более культурно

Админы сайта просит Вас о небольшой услуге! Пожалуйста, если Вам понравилась новость, то напишите в комментах что-нибудь о ней. Если же у Вас скаченный файл не работает, то тоже отпишитесь у нас. Администрация постарается помочь! Также не забудьте поставить рейтинг за понравившуюся новость, звездочки! Спасибо за оказание помощи!

Похожие новости:
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Информация
Место для рекламы, сдается, писать в ICQ 5429888 или в ЛС DiviProUT
Мини-профиль
Вторник
26 Января 2021
08:32

Логин:
Пароль:
[ Управление профилем ]
Поиск по сайту
Календарь новинок
Мини - чат
Лучшие авторы
1) MuzonVam (Запостил 3797)

2) egoistka12 (Запостил 2605)

3) Gunpowder (Запостил 2579)

4) nigolap (Запостил 2391)

5) aanyaa78 (Запостил 2047)

Best комментаторы
"
DiviProUT
Рейтинг: 15
Комментов: 110
"
yarik
Рейтинг: 0
Комментов: 32
"
ggenassi
Рейтинг: 6
Комментов: 28
"
mannn
Рейтинг: 0
Комментов: 20
"
Georgius2
Рейтинг: 1
Комментов: 17
А это видели?
» Шаблон для фотошопа - ковбой с оружием
» Новогодняя фоторамка – Новогодние волшебство
» Женский шаблон - Девушка в кожаной куртке
» Экшен для фотошопа - Кубик Рубик
» Linux Mint 12 LXDE RC [i386] (1xCD)
» Детский шаблон - Маленькая принцесса в стране чудесных роз
» Новогодняя рамка для фото - Рождественские украшения
» Новогодние шаблоны для фотомонтажа девочкам – Снегурочки
» Женский шаблон - Девушка в окружении сказочной природы
» Шаблон для фотошопа - за рулем в костюме
» Рамка для фотошоп - Золотая ветка
» Зимняя рамка для фотошопа – Мороз и солнце, день чудесный
» Шаблон для фотошоп - 3 жены
» Зимний детский шаблон для фотошоп - Маленькая русская красавица
» Шаблон для фотомонтажа - мальчик и слон
» Детский многослойный шаблон - Девочка в розовом платье и чудесные бабочки
» Зимний женский шаблон - Девушка в стильной меховой жилетке
» Клипарт - Колпаки Санта Клауса
» Шаблон мужской - В команде доктора хауса
» Шаблон мужской - резиденты comedy club
Друзья сайта

Обмен ссылками
Некоторые данные
Наш Баннер:
Скачать софт бесплатно | Скачать новый софт | Варезный софт | Варез портал Gigasoft

Поддержите сайт, разместив кнопку у себя на сайте

Интересные статейки:
» "Доктор Веб" обновляет продукты Dr.Web 5.0 для защиты почты и интернет-шлюзов Unix
» 14 хитростей Огненой лисы
» 7 смертных грехов.
» Ad Muncher 4.8 - удаление рекламы
» Google закрывает «почту будущего»
» Mozilla обещает внедрить мультисенсорные технологии в Firefox 4
» Nod 32 Ошибка 2753 - рассмотрим все докладно и понятно
» NOD32 отличие Business Edition от Home
» Schokk: RW больше нет
» Your Uninstaller! Pro v 7.0.2010.30 RePack by RED- полное удаление программ


Рассылка на E-mail

gigasoft

Статистика сайта
Счетчик материалов
Комментариев: 373
Новостей: 4822
Статей: 52
Сайтов: 50
Гостевая книга: 21

Для правообладателей Все материалы размещенные на сайте пренадлежат их владельцам и предоставляются исключительно в ознакомительных целях. Администрация ответственности за содержание материала не несет и убытки не возмещает. По истечении 24 часов материал должен быть удален с вашего компьютера. Незаконная реализация карается законами РФ и Украины: "Об авторском и смежном праве".При копировании материала, ссылка на сайт обязательна! Для правообладателей
Copyright © 2009 - 2021 Сайт управляется системой uCoz - GiGasoft.pp.ua » Скачать Бесплатно Софт, Фильмы, Музыка, Игры, Программы