Форум: "Сети";
Текущий архив: 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.043 c