Разница между сетевым программированием и программированием сокетов


16

Существуют ли существенные различия, когда мы говорим о «программировании сокетов» по ​​сравнению с «сетевым программированием»?

Существуют ли какие-либо темы, посвященные «сетевому программированию», но не «программированию сокетов»?

Ответы:


26

Сокетное программирование (по крайней мере, как обычно используется термин) - это программирование для одного конкретного сетевого API. Сокеты поддерживают протоколы на основе IP (прежде всего TCP и UDP) 1 .

Сетевое программирование может быть выполнено с использованием различных других API. В Windows есть несколько независимых от протокола API, таких как функции WNet * и Net *. В более старых версиях Windows также использовался NetBIOS / NetBEUI (интерфейс конечного пользователя NetBIOS) и большинство поддерживаемых (и, вероятно, все еще таковых) IPX / SPX (старый протокол Netware).

Однако большинство современных сетевых программ выполняется либо с использованием сокетов напрямую, либо с использованием различных других слоев поверх сокетов (например, довольно много делается через HTTP, который обычно реализуется с TCP через сокеты). TCP / IP и UDP / IP (а также ряд других протоколов на основе IP) выполняются главным образом через интерфейс сокетов. Теоретически, можно использовать другие программные интерфейсы, но на практике сокетов кажется достаточным, так что их замена не представляет большого интереса. Однако следует упомянуть, что сокеты Windows (WinSock) имеют довольно много расширений, более или менее уникальных для Windows. Я полагаю, что есть некоторый аргумент, действительно ли код, который использует эти расширения, квалифицируется как код «сокетов» или нет - они являются расширениями, основанными на тех же концепциях, но код, использующий их, не является т обычно переносимы на другие системы. Я предполагаю, будет ли он квалифицироваться как «сокеты» или нет, в первую очередь зависит от того, думаете ли вы о сокетах скорее как о концепции, или как о очень специфическом наборе функций, параметров и т. Д.

Изменить (в ответ на комментарий):

Трудно сказать, подразумевает ли «знание сокетов» знание «всего» о TCP и UDP. Давайте рассмотрим лишь один маленький кусочек: одна типичная демонстрационная программа для сокетов - это создание программы чата клиент / сервер. Клиент подключается к серверу, и когда пользователь на одном клиенте что-то печатает, он перенаправляется другим клиентам, которые подключены к тому же серверу. Каждый клиент отображает то, что приходит с сервера, и позволяет пользователю вводить сообщения для отправки другим клиентам.

В то же время подумайте, что включает в себя «настоящая» программа чата, такая как AIM, Windows Messenger, iChat и т. Д. Для обработки не только текста, но и голоса, видео, передачи файлов, групп, списков и т. Д. Типичная программа, вероятно, включает в себя дюжину различных стандартов, включая такие, как SIP, STUN, TURN, RTCP, RTP, XAMPP, mDNS и т. Д. ,

IMO, кто-то, кто «знает сокеты», должен иметь возможность кодировать первую (демо-уровень, только текст) программу чата за несколько часов, не тратя много времени на файлы помощи (и тому подобное), проводя исследования. Если бы они не заявили хотя бы некоторый предыдущий опыт работы над «настоящей» программой чата, я бы не ожидал, что они даже узнают, какие RFC / стандарты применимы к таким вещам.

В общем, то же самое: учитывая количество RFC (и различных других стандартов), которые применяются ко всем различным вещам, которые люди делают по сетям, неразумно ожидать, что кто-нибудь запомнит их все. Тем не менее, если у вас есть набор требований для чего-то, что, как вы ожидаете, люди смогут легко обрабатывать в «локальной» программе, просто добавление «по сети» в качестве требования обычно не должно создавать огромных трудностей. (хотя может иметь дело с такими проблемами, как задержка сети может).


1 Сокеты в Unix также поддерживают сокеты семейства Unix, но они (по крайней мере обычно) используются для IPC внутри машины, а не для работы в сети. Существуют также буквально десятки других протоколов для таких вещей, как управление маршрутизаторами, которые сокеты на самом деле не поддерживают (кроме необработанных сокетов, позволяющих создавать и отправлять произвольные пакеты).


Спасибо, теперь этот ответ стоит проголосовать. :-) Итак, могу ли я заключить, что когда я говорю, что знаю программирование сокетов, это означает, что нужно иметь дело только со всем по TCP / UDP, только? Мне нужно знать все о TCP / UDP?
Aquarius_Girl

@AnishaKaul: см. Отредактированный ответ.
Джерри Коффин

@JerryCoffin: Возможно, стоит отметить, что сокеты также являются подмножеством протоколов на основе IP. Есть такие вещи, как ICMP / IP, которые также не покрыты сокетами.
Мэтью Шарли

6

«Сетевое программирование» потребует некоторых сетевых технологий - например, RPC. Сокеты (скорее всего, вы имеете в виду сокеты BSD) являются примером такой технологии. Таким образом, «программирование сокетов» является подмножеством «сетевого программирования».


@ Anisha Kaul: Хорошо, программирование RPC - это сетевое программирование (его подмножество), и одна важная концепция RPC - это так называемое связывание строк - см. Msdn.microsoft.com/en-us/library/aa378691(v=VS.85) .aspx Вам не нужна эта вещь при программировании сокетов BSD.
Sharp

@Anisha Kaul: Нет, «все возможности» - это огромный список. Я бы назвал некоторые широко используемые - хорошие примеры - Java RMI и .NET Remoting.
резкое соединение

-3

Да, это правда, что сетевое программирование требует сетевых технологий, в то время как программирование сокетов является подмножеством сетевого программирования. Большинство современных сетевых программ выполняется либо с использованием сокетов напрямую, либо с использованием различных других слоев поверх сокетов.


3
это, кажется, не добавляет ничего существенного к тому, что уже было опубликовано в предыдущих ответах
комнат
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.