Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
Григорьев Антон ©   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.58 MB
Время: 0.036 c
14-1101306128
OneFragLeft
2004-11-24 17:22
2004.12.12
Зашаренные ресурсы.


1-1101290251
ККВ
2004-11-24 12:57
2004.12.12
Чем открыть файл *.wdb?


14-1101112728
Александр Иванов
2004-11-22 11:38
2004.12.12
Бросаю курить


3-1100082557
alsov1
2004-11-10 13:29
2004.12.12
Не получается заставить фильтровать TADOQuery


3-1100437995
denis24
2004-11-14 16:13
2004.12.12
паковка *.mdb





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский