Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прошу оценить статью про сокеты


Страницы:   1 2

Григорьев Антон ©   (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]

Пока еще не доступна


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо