Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.12;
Скачать: CL | DM;

Вниз

Прошу оценить статью про сокеты   Найти похожие ветки 

 
Григорьев Антон ©   (2004-06-15 17:31) [0]

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

1. Введение в сетевые протоколы. Стандартные (блокирующие и неблокирующие) сокеты.

2. Сокеты Windows (асинхронные).

3. Компоненты Delphi для работы с сокетами.

Основная идея: статьи не должны быть исчерпывающими, но должны объяснять всё, начиная с азов, чтобы быть полезной тем людям, которые о сокетах знают только то, как они называются. Ну и, конечно, всё ориентировано на Delphi, а не на C/C++.

Первая статья уже готова, лежит по адресу http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021. Прошу всех, кому это интересно, прочитать и высказать своё мнение. Новичков - что непонятно, профи - что неправильно.

На счёт сроков выхода остальных статей ничего обещать не могу. Вторую статью только начал детально обдумывать (Rouse_, помнишь мой вопрос про версии WinSock? :)). К третьей вообще не приступал. Но энтузиазм пока есть, так что если вы не скажете, что всё совсем плохо, будет продолжение :)


 
Anatoly Podgoretsky ©   (2004-06-15 17:41) [1]

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


 
Anatoly Podgoretsky ©   (2004-06-15 17:42) [2]

А размещаться будет в Лицее или в статьях?


 
Григорьев Антон ©   (2004-06-15 17:49) [3]

Статья уже доступна, просто в URL оказался включен символ точки, который, вообще-то, стоит там для обозначения конца приложения :))

Статья тут: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1021

Размещена в Hello, World


 
Григорьев Антон ©   (2004-06-15 17:51) [4]


> стоит там для обозначения конца приложения


Не приложения, конечно, а предложения :)) Ну что с программиста взять? :))


 
Piter ©   (2004-06-15 22:44) [5]

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

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

Единственное, что мне пока не нравится - то, как ты склоняешь MSDN :)
По моему, эта аббревиатура не склоняется...

Остальные параметры сокета детально описаны в MSDN"е

А недостающие сведения легко получить из MSDN"а

Мне кажется красивее будет:

Остальные параметры сокета детально описаны в MSDN

Ну это, конечно, просто мелочи


 
Rouse_ ©   (2004-06-16 15:03) [6]

> Rouse_, помнишь мой вопрос про версии WinSock?
Вот ищу:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcewinsk/html/ceconbackwardcompatibilityforwindowssocke ts11applications.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/ceconcompatiblenameresolutionfortcpipinwi ndowssockets11api.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/network_protocol_support_in_windows.asp

Короче ничего толком не сказано...
Попробуй еще просмотреть топики по словам Winsock, features,  distinction и т.п.
Главное можно заметить это полную обратную совместимость...


 
Rouse_ ©   (2004-06-16 15:09) [7]

Да, по статье:
В библиотеке сокетов предусмотрена константа InAddr_Any, позволяющая не указывать явно адрес в программе, а оставить его выбор на усмотрение системы. Для этого надо полю sin_addr.S_addr присвоить значение InAddr_Any.

INADDR_ANY - позволяет серверному приложению слушать клиента через любой сетевой интерфейс. Если на компьютере несколько сетевых карт это позволит ему получать отклики от клиента с любой из них.


 
Graber   (2004-06-17 02:26) [8]

Конечно это круто :)


 
Григорьев Антон ©   (2004-06-17 10:44) [9]


> Rouse_ ©   (16.06.04 15:09) [7]
> INADDR_ANY - позволяет серверному приложению слушать клиента
> через любой сетевой интерфейс. Если на компьютере несколько
> сетевых карт это позволит ему получать отклики от клиента
> с любой из них.


Откуда такая информация? Просто я на практике сталкивался с ситуацией, когда клиент не мог подключиться к моему серверу, работающему в компьютере с двумя сетевыми картами. Помогла замена INADDR_ANY на IP-адрес той карты, которая смотрела в сеть с клиентом.


 
Verg ©   (2004-06-17 11:10) [10]


> Просто я на практике сталкивался с ситуацией, когда клиент
> не мог подключиться к моему серверу, работающему в компьютере
> с двумя сетевыми картами. Помогла замена INADDR_ANY на IP-адрес
> той карты, которая смотрела в сеть с клиентом.


Быть такого не может.


 
Anatoly Podgoretsky ©   (2004-06-17 11:18) [11]

Григорьев Антон ©   (15.06.04 17:49) [3]
А стоило бы в Лицее, это развитие Hello Word, особенно когда серия статей, поговори с Королевой, пусть переместит


 
Григорьев Антон ©   (2004-06-17 11:27) [12]


> Verg ©   (17.06.04 11:10) [10]
> Быть такого не может.


Тем не менее, было. Правда, я посмотрел код пвнимательнее, там всё очень хитро, вполне возможно, что причина и не в том, что сокет не по тому адресу слушал. Сейчас, к сожалению, точно проверить возможности нет.

Ну ладно, посмотрим, какие ещё будут замечания, потом всё сразу исправлю.


 
Rouse_ ©   (2004-06-17 11:29) [13]

> Откуда такая информация?
Во первых из личного опыта, а во вторых "Программирование в сетях Microsoft Windows" Э.Джонс, Д.Оланд стр. 123, в самом низу вместе с INADDR_BROADCAST...


 
Григорьев Антон ©   (2004-06-17 11:52) [14]


> Rouse_ ©


Убедил. Исправлю.


 
Piter ©   (2004-06-17 14:11) [15]

Итак, как обещал пишу свое мнение по поводу статьи с точки зрения человека, которому статья и адресована.

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 14:52) [16]


> 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 исключительно для связи с разными устройствами: датчиками, расходомерами, регистраторами и т.п. Вот привычка и сказалась :))


 
VMcL ©   (2004-06-17 15:45) [17]

>>Григорьев Антон ©  (17.06.04 14:52) [16]

>Категорически не согласен. Слово "поток" я использую только для перевода термина "stream". А "thread" у меня всегда нить.

Поддерживаю. У меня тоже так. Поток ассоциируется с данными, а выполняемый код, всё-таки, с нитью.

P.S. Это, естественно, ИМХО.

P.P.S. А "дяде с большими ушами", который впервые перевёл thread как поток, а не нить, "я бы уши пооткрутил".


 
VMcL ©   (2004-06-17 15:47) [18]

P.P.P.S. Хотя, чтобы были и овцы целы и волки сыты, для устранения путаницы можно вместо "нить" писАть "кодовый поток".


 
Григорьев Антон ©   (2004-06-17 16:52) [19]


> VMcL ©   (17.06.04 15:47) [18]
> P.P.P.S. Хотя, чтобы были и овцы целы и волки сыты, для
> устранения путаницы можно вместо "нить" писАть "кодовый
> поток".


Есть ещё вариант: "поток данных" для stream и "поток исполнения" для thread. Тоже не запутаешься, но будет громоздко.


 
Rouse_ ©   (2004-06-17 16:58) [20]

А я вообще Stream произношу не иначе как "Стрим" а для Thread - "поток" :)
Это конечно мое ИМХО - но практически все знакомые мне программисты используют именно данный вариант :)))


 
Rouse_ ©   (2004-06-17 16:59) [21]

> [19] Григорьев Антон ©   (17.06.04 16:52)
Предлагаю просто ввести в статью аппендикс "Используемые в статье термины" и в нем английский и русский варианты, чтоб не путались...


 
Piter ©   (2004-06-17 16:59) [22]

Григорьев Антон (17.06.04 14:52) [16]
Категорически не согласен. Слово "поток" я использую только для перевода термина "stream".


я тоже согласен. Но в русском сообществе более употребимо "поток" (имхо).
В переводах книг известных авторов (Рихтер, Тейксера и Пачеко, например) используется слово "поток".

Я не буду про квалификацию переводчиков и тому подобное. Я просто констатирую факт. В любом случае, можно хотя бы упомянуть, что нить это тоже самое, что поток (thread). А то многие новички могут не понять...


 
Piter ©   (2004-06-17 17:00) [23]

Rouse_ (17.06.04 16:58) [20]
А я вообще Stream произношу не иначе как "Стрим" а для Thread - "поток" :)


солидарен. Именно так и происходит


 
Piter ©   (2004-06-17 17:00) [24]

Удалено модератором
Примечание: Дубль...


 
Григорьев Антон ©   (2004-08-11 17:55) [25]

Наконец-то у меня дошли руки внести обещанные исправления. Спасибо всем, кто принял участие в обсуждении.


 
Vlad Oshin ©   (2004-08-12 10:26) [26]

спасибо за статью


 
Alex Konshin ©   (2004-08-12 11:14) [27]

6) Кроме того, один компьютер может иметь несколько IP-адресов, если в нём несколько сетевых карт

почему опять же сетевых карт? Компьютер может иметь 2 DSL модема и иметь два дополнительных IP адреса при этом

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


 
Alex Konshin ©   (2004-08-12 11:31) [28]

Кстати, снифферы не имеют отношения к IP, они могут перехватывать все пакеты (а не только IP) потому, что это может делать сетевая карта. Говорят, что есть карты, которые фильтруют базар, но я лично таких не видел (хотя и не искал).


 
Григорьев Антон ©   (2004-10-01 15:59) [29]

Появилось продолжение статьи. Находится здесь: http://www.delphikingdom.com/asp/viewitem.asp?CatalogID=1060
Жду ваших замечаний


 
Digitman ©   (2004-10-01 16:08) [30]


> Григорьев Антон


по сабжу : по-любому, есть ли там неточности или нет их - статья оч хорошая


 
Rouse_ ©   (2004-10-01 18:03) [31]

Молодец, статья великолепная, особенно в части ошибок Джонса и Оланда (или переводчика :)...


 
Луарвик   (2004-10-01 18:58) [32]

Надеюсь, что статья №3 все-таки выйдет... Нужна она мне!


 
Rouse_ ©   (2004-10-01 20:43) [33]

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

Я предлагаю сделать всеже обзор ScktComp, INDY, оберки от NetMasters и Sockets (по последнему обычно уйма вопросов...) некоторые еще используют ICS


 
Verg ©   (2004-10-01 23:48) [34]

Все хорошо, мне непонятно одно - ....
ладно, возбухать не буду - все равно незачем...

Критики желаем?

Хммм.... (стон:))
Ну почитай ты уже, наконец, Стивенса...

Ты почему это сделал? Варианты (только без обид, т.е. на чистоту:))):

1. Я давно работаю с сетями TCP/IP и мне есть что сказать
2. Я хочу показать, что я нефиговый писатель.
3. У мне еще куча комплексов, но хоть от одного я хочу избавиться.

Честно говоря, статья достойна внимания в смысле, что на "русском языке". В том числе, и а именно "сокеты для домохозяек". Здорово, чес слово... Это ж вам не 1990 год, а все же 2004-ый, когда великое слово "сокет" все еще содержит в себе трепещащую тайну... Вот бы, блин, в 90-ом ты такую статью в fido бы, например, запустил... носили бы тебя на руках еще бы лет 5-ять....

Молодца, так держать!


 
Луарвик   (2004-10-02 00:01) [35]


> Честно говоря, статья достойна внимания в смысле, что на
> "русском языке". В том числе, и а именно "сокеты для домохозяек".
> Здорово, чес слово... Это ж вам не 1990 год, а все же 2004-ый,
> когда великое слово "сокет" все еще содержит в себе трепещащую
> тайну... Вот бы, блин, в 90-ом ты такую статью в fido бы,
> например, запустил... носили бы тебя на руках еще бы лет
> 5-ять....

Ладно, "муж", глав. что народу нравиться ;)


 
Rouse_ ©   (2004-10-02 12:38) [36]

> [34] Verg ©   (01.10.04 23:48)
Я не понял правда, а при чем тут Стивенс? :)
Статья хороша тем что все собрано в одном месте и правильно подано, т.е. не нужно искать информацию по разным мануалам и т.п. ...



Страницы: 1 вся ветка

Текущий архив: 2004.12.12;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.024 c
6-1096623637
TUser
2004-10-01 13:40
2004.12.12
ICS под XP


14-1101283486
PVOzerski
2004-11-24 11:04
2004.12.12
USB-принтер с NT4 - возможно ли?


4-1098222275
AlexeyM
2004-10-20 01:44
2004.12.12
отлов сообщений


14-1101397559
syte_ser78
2004-11-25 18:45
2004.12.12
Как зовется компонент?


3-1100619712
~Blade~
2004-11-16 18:41
2004.12.12
Обновление таблицы в адо