![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прошу оценить статью про сокеты
Григорьев Антон © (2004-06-15 17:31:00)В форумах (в т.ч. и здесь) очень много вопросов по сокетам, и это сподвигло меня на написания цикла из трёх статей, посвящённых им. Темы статей следующие:
1. Введение в сетевые протоколы. Стандартные (блокирующие и неблокирующие) сокеты.
2. Сокеты Windows (асинхронные).
3. Компоненты Delphi для работы с сокетами.
Основная идея: статьи не должны быть исчерпывающими, но должны объяснять всё, начиная с азов, чтобы быть полезной тем людям, которые о сокетах знают только то, как они называются. Ну и, конечно, всё ориентировано на Delphi, а не на C/C++.
Первая статья уже готова, лежит по адресу http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021.Прошу всех, кому это интересно, прочитать и высказать своё мнение. Новичков - что непонятно, профи - что неправильно.
На счёт сроков выхода остальных статей ничего обещать не могу. Вторую статью только начал детально обдумывать (Rouse_, помнишь мой вопрос про версии WinSock? :)). К третьей вообще не приступал. Но энтузиазм пока есть, так что если вы не скажете, что всё совсем плохо, будет продолжение :)
Григорьев Антон (2004-06-17 14:52:00) [21]
> Piter ©
Спасибо, много ценных замечаний. На отвечу только подробно на те, с которыми не согласен.
> Причем, первая часть - теория, получилась немного скомканная.
> Имхо, надо или ее немного расширить (с диаграммами там,
> с рисунками), с более подробным описанием. Или исключить,
> дав ссылку на зарекомендовавший себя материал. Я то понял
> теоретические выкладки, потому что практически все знаю,
> но те, кто впервые сталкивается... думаю, не поймут. Как-то
> слишком кратко расказывается и про ARP, про OSI, про уровни,
> про #define в C++ (зачем-то), про роутеры...
По-моему, тут всё надо оставить как есть. Новичку в серьёзной статье сложно будет сразу разобраться со всеми тонкостями протоколов IP и TCP. Вот я и сделал обзор возможностей, в котором попытался избежать тех подробностей, без которых вполне можно начать программировать. Чтобы дать общее представление. А ссылка на подробную статью есть в конце. Про define тоже надо знать, иначе нельзя будет до конца объяснить понять поведение макросов FD_XXX и константы FD_MAX_SIZE.
> стоит упомянуть, что в windows эти фукции также есть. А
> то немного непонятно, честное слово.
Там же чуть ниже написано, что в Delphi эти функции надо использовать.
> стоит упомянуть, по моему, какие протоколы какой уровень
> OSI реализуют. Так более понятно будет. А то я пока представляю
> с трудом.
Цитаты из статьи:
"Кроме IP, в стеке TCP/IP существует ещё несколько протоколов, решающих задачи сетевого уровня."
"Протоколами транспортного уровня в стеке TCP/IP являются протоколы TCP и UDP."
"Уровни сессии, представлений и приложения в стеке TCP/IP не разделены: протоколы HTTP, FTP, SMTP и т.д., входящие в этот стек, решают задачи всех трёх уровней."
Про IP, может быть, недостаточно чётко (это я поправлю), а про остальные протоколы всё написано вполне определённо.
> все таки стоит упомянуть, чем различаются эти версии WinSock
> (а в 2.0 появились заметные усовершенствования). А уж потом
> приписать, что модуль WinSock не расчитан на версии 2.0
> и выше. И написать что делатть, если хочется использовать
> 2.0
Это тема для следующей статьи цикла. Там всё будет очень подробно.
> ну это не так. По-моему, там можно определить, какая максимальная
> версия винсока поддерживается. И еше кучу всего. Лучше написать.
И часто вы этой возможностью пользуетесь? Я считаю, что того, что я написал, достаточно для того, чтобы человек начал что-то понимать, а дальше - MSDN, MSDN и ещё раз MSDN.
> лучше употреблять слово многопоточном. И вообще, далее по
> статье слово нить заменять на слово поток. Конечно, нить
> тоже верное определение, но в настоящее время поток более
> "стандартное" слово и в подавляющем большинстве случаев
> используется именно оно
Категорически не согласен. Слово "поток" я использую только для перевода термина "stream". А "thread" у меня всегда нить. Потому что очень трудно понять текст, где используются оба этих термина, если обаих переводить как поток. Попробуйте, например, объяснить, что делают функции CoMarshalInterThreadInterfaceInStream и CoGetInterfaceAndReleaseStream и не запутаться в том, где какой поток имеется ввиду.
> да. Но по моему, есть значение, когда сервер привязывается
> ко всем интерфейсам, ловит подключения по любым устройствам.
> Надо упомянуть про это
Да, тут у меня ошибка. Rouse_ и Verg меня уже убедили.
P.S. А программу с устройством (см. п. 7) я перепутал потому, что на работе использую TCP исключительно для связи с разными устройствами: датчиками, расходомерами, регистраторами и т.п. Вот привычка и сказалась :))
Piter (2004-06-17 14:11:00) [22]Итак, как обещал пишу свое мнение по поводу статьи с точки зрения человека, которому статья и адресована.
1) Статью явно надо рабивать на две части. Первая часть - это теория. Вторая - практика, начиная с раздела "Создание сокета".
Причем, первая часть - теория, получилась немного скомканная. Имхо, надо или ее немного расширить (с диаграммами там, с рисунками), с более подробным описанием. Или исключить, дав ссылку на зарекомендовавший себя материал. Я то понял теоретические выкладки, потому что практически все знаю, но те, кто впервые сталкивается... думаю, не поймут. Как-то слишком кратко расказывается и про ARP, про OSI, про уровни, про #define в C++ (зачем-то), про роутеры...
А сейчас пройдусь по статье более детально:
2) В частности, для протоколов TCP и UDP адрес состоит из IP-адреса сетевой карты и номера порта
почему сетевой карты? IP адрес могут иметь не только сетевые карты
3) Библиотека сокетов разрабатывалась для ОС Unix, в которой традиционно высоко ценилась переносимость между платформами, поэтому она содержит функции, позволяющие не задумываться о порядке байт в числах
стоит упомянуть, что в windows эти фукции также есть. А то немного непонятно, честное слово.
4) стоит упомянуть, по моему, какие протоколы какой уровень OSI реализуют. Так более понятно будет. А то я пока представляю с трудом.
5) Также следует знать, что адрес 127.0.0.1 задаёт т.н. локальный узел
почему именно 127.0.0.1? Вся подсеть класса A является loopback интерфейсом (от 127.0.0.1 до 127.255.255.255)
6) Кроме того, один компьютер может иметь несколько IP-адресов, если в нём несколько сетевых карт
почему опять же сетевых карт? Компьютер может иметь 2 DSL модема и иметь два дополнительных IP адреса при этом
7) Новички нередко думают, что фраза "программа поддерживает соединение через TCP/IP" полностью описывает то, как можно связаться с программой и получить данные. На самом деле необходимо знать формат пакетов, которые это устройствоможет принимать и отправлять
почему устройство? Программа...
8) Ещё одним достоинством UDP является возможность отправки широковещательных дейтаграмм. Для этого нужно указать IP-адрес 255.255.255.255, и такую дейтаграмму получат все сокеты в локальной сети
Думаю, стоит рассказать, что 255.255.255.255 не единственный широковещательный адрес. Броадкаст адрес бывает и для сетей класса B,C (например, 160.241.45.255 для сети класса C: 160.241.45 с маской 255.255.255.0)
9) Допустимы версии 1.0 ($0001), 1.1 ($0101), 2.0 ($0002) и 2.2 ($0202). Пока мы используем стандартные сокеты, принципиальной разницы между этими версиями нет
все таки стоит упомянуть, чем различаются эти версии WinSock (а в 2.0 появились заметные усовершенствования). А уж потом приписать, что модуль WinSock не расчитан на версии 2.0 и выше. И написать что делатть, если хочется использовать 2.0
10) Параметр WSData является выходным параметром, т.е. значение, которое имела переменная до вызова функции, игнорируется, а имеет смысл только то значение, которая эта переменная получит после вызова функции. Через этот параметр передаётся дополнительная информация о библиотеке сокетов. В большинстве случаев эта информация не представляет никакого интереса, поэтому её можно игнорировать
ну это не так. По-моему, там можно определить, какая максимальная версия винсока поддерживается. И еше кучу всего. Лучше написать.
11) Функцию WSAStartup достаточно вызвать один раз, даже в многонитевом приложении
лучше употреблять слово многопоточном. И вообще, далее по статье слово нить заменять на слово поток. Конечно, нить тоже верное определение, но в настоящее время поток более "стандартное" слово и в подавляющем большинстве случаев используется именно оно
12) Система привязывает сокет к адресу, когда сокет TCP-сервера переходит в режим ожидания подключения или когда сокет UDP-сервера ожидает получения пакета. В этот момент система не имеет никакой информации о том, с какими узлами будет вестись обмен через данный сокет, и может выбрать не тот адрес, который нужен. Поэтому сокеты серверов, работающих в подобных системах, должны явно привязываться к нужному адресу.
да. Но по моему, есть значение, когда сервер привязывается ко всем интерфейсам, ловит подключения по любым устройствам. Надо упомянуть про это
Григорьев Антон (2004-06-17 11:52:00) [23]
> Rouse_ ©
Убедил. Исправлю.
Rouse_ (2004-06-17 11:29:00) [24]> Откуда такая информация?
Во первых из личного опыта, а во вторых "Программирование в сетях Microsoft Windows" Э.Джонс, Д.Оланд стр. 123, в самом низу вместе с INADDR_BROADCAST...
Григорьев Антон (2004-06-17 11:27:00) [25]
> Verg © (17.06.04 11:10) [10]
> Быть такого не может.
Тем не менее, было. Правда, я посмотрел код пвнимательнее, там всё очень хитро, вполне возможно, что причина и не в том, что сокет не по тому адресу слушал. Сейчас, к сожалению, точно проверить возможности нет.
Ну ладно, посмотрим, какие ещё будут замечания, потом всё сразу исправлю.
Anatoly Podgoretsky (2004-06-17 11:18:00) [26]Григорьев Антон © (15.06.04 17:49) [3]
А стоило бы в Лицее, это развитие Hello Word, особенно когда серия статей, поговори с Королевой, пусть переместит
Verg (2004-06-17 11:10:00) [27]
> Просто я на практике сталкивался с ситуацией, когда клиент
> не мог подключиться к моему серверу, работающему в компьютере
> с двумя сетевыми картами. Помогла замена INADDR_ANY на IP-адрес
> той карты, которая смотрела в сеть с клиентом.
Быть такого не может.
Григорьев Антон (2004-06-17 10:44:00) [28]
> Rouse_ © (16.06.04 15:09) [7]
> INADDR_ANY - позволяет серверному приложению слушать клиента
> через любой сетевой интерфейс. Если на компьютере несколько
> сетевых карт это позволит ему получать отклики от клиента
> с любой из них.
Откуда такая информация? Просто я на практике сталкивался с ситуацией, когда клиент не мог подключиться к моему серверу, работающему в компьютере с двумя сетевыми картами. Помогла замена INADDR_ANY на IP-адрес той карты, которая смотрела в сеть с клиентом.
Graber (2004-06-17 02:26:00) [29]Конечно это круто :)
Rouse_ (2004-06-16 15:09:00) [30]Да, по статье:
В библиотеке сокетов предусмотрена константа InAddr_Any, позволяющая не указывать явно адрес в программе, а оставить его выбор на усмотрение системы. Для этого надо полю sin_addr.S_addr присвоить значение InAddr_Any.
INADDR_ANY - позволяет серверному приложению слушать клиента через любой сетевой интерфейс. Если на компьютере несколько сетевых карт это позволит ему получать отклики от клиента с любой из них.
Rouse_ (2004-06-16 15:03:00) [31]> Rouse_, помнишь мой вопрос про версии WinSock?
Вот ищу:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcewinsk/html/ceconbackwardcompatibilityforwindowssockets11applications.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcewinsk/html/ceconwindowssockets2features.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcewinsk/html/ceconcompatiblenameresolutionfortcpipinwindowssockets11api.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/network_protocol_support_in_windows.asp
Короче ничего толком не сказано...
Попробуй еще просмотреть топики по словам Winsock, features, distinction и т.п.
Главное можно заметить это полную обратную совместимость...
Piter (2004-06-15 22:44:00) [32]Я сам плохо разбираюсь в сокетах - и сам собирался писать статью, чтобы и другим помочь и самому детальней все узнать...
Пока бегло просмотрел - по моему, супер! Работа очень изрядная проделана и очень хорошо все получилось. Слог отличный, все понятно написао.
Правда, повторюсь, мое мнение - это не мнение критика, который может что-то исправить, это мнение человека для которого эта статья расчитана.
В общем, вводную теорию я и так знаю, а вот с работой на WinApi не очень. В любом случае, обязательно почитаю статью повнимательнее - и расскажу свое мнение более подробно...
Единственное, что мне пока не нравится - то, как ты склоняешь MSDN :)
По моему, эта аббревиатура не склоняется...
Остальные параметры сокета детально описаны в MSDN'е
А недостающие сведения легко получить из MSDN'а
Мне кажется красивее будет:
Остальные параметры сокета детально описаны в MSDN
Ну это, конечно, просто мелочи
Григорьев Антон (2004-06-15 17:51:00) [33]
> стоит там для обозначения конца приложения
Не приложения, конечно, а предложения :)) Ну что с программиста взять? :))
Григорьев Антон (2004-06-15 17:49:00) [34]Статья уже доступна, просто в URL оказался включен символ точки, который, вообще-то, стоит там для обозначения конца приложения :))
Статья тут: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021
Размещена в Hello, World
Anatoly Podgoretsky (2004-06-15 17:42:00) [35]А размещаться будет в Лицее или в статьях?
Anatoly Podgoretsky (2004-06-15 17:41:00) [36]Пока еще не доступна