Как работают сокеты windows

Как работают сокеты windows

Добрый день, уважаемые посетители и читатели блога, недавно я на одном из форумов наткнулся на дискуссию, на тему того, что такое сокеты windows и как их посмотреть и подумал, что это неплохая тема для статьи. Подумал и написал :)). Думаю эта заметка будет полезна начинающим системным администраторам, в понимании того, как на транспортном уровне модели OSI найти проблему или проверить доступность приложения по номеру порта, хочу отметить, что эти знания фундаментальные, и их понимание заложит в вас отличную базу, для дальнейшей работы, на любом предприятии.

Понятие windows sockets приложения

Что такое сокет — это по сути область оперативной памяти, в которой на определенном сетевом порту (TCP/UDP) работает приложение, и именно оно прослушивает нужный порт. Какая задача стояла перед программистами, задача простая переместить информацию из оперативной памяти одного компьютера, в оперативную память другого компьютера. Дальше это может быть представлено как:

Номер сокета Windows, это номер ячейки оперативной памяти к которому привязано приложение. Приложение привязавшись к некой области оперативной памяти начинает туда писать данные и сокет из этой области памяти начинает мелкими пакетами по 65 кбайт, начинает передавать в сеть на другое устройство. На другой стороне эти кусочки, так же помещаются в ОЗУ, желательно в той же последовательности, и сокет с той стороны начинает их разбирать, и представлять пользователю из какого то приложения.

Список сокетов приложений в Windows

У меня стоит операционная систем Windows 8.1, показывать я буду все на ней, в прошлый раз мы кстати в ней лечили баг, что был не найден run vbs. Для того, чтобы посмотреть какие сокеты соответствуют каким приложениям и каким TCP/UDP портам, вы должны перейти в директорию

и отыскать там файл services, он будет без расширения, но его можно открыть правой кнопкой мыши через обычный блокнот, у меня это будет notepad++.

Открыв данный файл вы увидите название службы (приложения) номер сокета (TCP/UDP) и описание. Для примера видно, что сервер ftp работает по портам 20 и 21. По сути тут системе и задаются стандарты по которым должны работать службы.

Как посмотреть сокеты приложений у вас на компьютере

Тут два метода которыми я пользуюсь. Представим себе ситуацию, что вы установили некое приложение, все работает пытаетесь на него попасть с другого компьютера по сети, но не можете. Отключаете брандмауэр на том компьютере, и все начинает работать, вывод блокируется какой то порт этого приложения. Его вычислить поможет нам две утилиты, первая из командной строки, а вторая имеет удобный графический интерфейс.

Более подробно про утилиту netstat и ее использование читайте по ссылке. В итоге вы получите сводную таблицу, в которой будет вот, что интересно:

  • Тип протокола — TCP или UDP
  • Адрес отправителя с указанием портов
  • Адрес получателя с указанием портов
  • Состояние — либо слушает либо установил соединение и закрыто
  • PID это номер идентифицирующий приложение

Как видите в примере у меня много сессий по 443 и 80 порту по сути это браузер Google Chrome.

Приложение заняв сокет, уже не позволит на нем же открыться другому приложению, Сокет живет минут 10.

Как изменить время жизни сокета

Для того, чтобы в операционной системе Windows изменить TTL или как его еще называют время жизни сокета, вам необходимо воспользоваться реестром. Открываете редактор реестра Windows 8.1. Переходите в раздел

Там есть ключ TcpTimedWaitDelay, если его нет то нужно его создать. Укажите нужное вам десятичное значение. TcpTimedWaitDelay — Этот параметр определяет интервал времени, в течение которого подключение находится в состоянии TIME_WAIT, прежде чем будет закрыто. Пока подключение находится в состоянии TIME_WAIT, пара сокетов не может быть использована повторно (это т. н. «состояние 2MSL»). Согласно документу RFC793, данное значение должно в два раза превышать максимальное время жизни пакета в сети.

Как узнать PID приложения

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

В диспетчере задач, найдите поле ИД процесса .если его не будет то добавьте.

Теперь давайте смотреть, в правой части я вижу приложение skype и оно имеет PID 4352, смотрим в левой части экрана и видим порты и Ip адрес, которые слушает данной приложение.

Ну и еще есть утилита TCPView, про нее я уже отдельно писал. Утилита бесплатная и имеет графический интерфейс, запустив ее вы сразу видите кому какой PID принадлежит. Так же видно все сокеты и их состояния.

Думаю, у вас теперь не должно быть вопроса, что такое сокеты windows и как их посмотреть, всем спасибо за прочтение.

Читайте также:  Гаджеты для управлением windows

Сокеты Windows. Пример сокетов с использованием архивов Windows Sockets: Example of Sockets Using Archives

В этой статье представлен пример использования класса CSocket. This article presents an example of using class CSocket. В примере используются CArchive объекты для сериализации данных через сокет. The example employs CArchive objects to serialize data through a socket. Обратите внимание, что это не является сериализацией документа в файл или из него. Note that this is not document serialization to or from a file.

В следующем примере показано, как использовать Архив для отправки и получения данных через CSocket объекты. The following example illustrates how you use the archive to send and receive data through CSocket objects. Этот пример разработан таким образом, что два экземпляра приложения (на одном компьютере или на разных компьютерах в сети) обмениваются данными. The example is designed so that two instances of the application (on the same machine or on different machines on the network) exchange data. Один экземпляр отправляет данные, которые другой экземпляр получает и подтверждает. One instance sends data, which the other instance receives and acknowledges. Любое приложение может инициировать обмен, а также может работать как сервер или как клиент для другого приложения. Either application can initiate an exchange, and either can act as server or as client to the other application. В классе представления приложения определена следующая функция: The following function is defined in the application’s view class:

Наиболее важным моментом в этом примере является то, что его структура параллельно работает с Serialize функцией MFC. The most important thing about this example is that its structure parallels that of an MFC Serialize function. PacketSerialize Функция члена состоит из if оператора с else предложением. The PacketSerialize member function consists of an if statement with an else clause. Функция получает две ссылки CArchive в качестве параметров: ардата и аракк. The function receives two CArchive references as parameters: arData and arAck. Если объект архива ардата задан для сохранения (отправки), if ветвь выполняется; в противном случае, если ардата установлен для загрузки (получение), функция принимает else ветвь. If the arData archive object is set for storing (sending), the if branch executes; otherwise, if arData is set for loading (receiving) the function takes the else branch. Дополнительные сведения о сериализации в MFC см. в разделе сериализация. For more information about serialization in MFC, see Serialization.

Предполагается, что объект архива аракк является противоположным для ардата. The arAck archive object is assumed to be the opposite of arData. Если ардата — для Send, аракк получает, а обратное — true. If arData is for sending, arAck receives, and the converse is true.

Для отправки функция-пример циклически обрабатывает указанное число раз, каждый раз создавая случайные данные для демонстрационных целей. For sending, the example function loops for a specified number of times, each time generating some random data for demonstration purposes. Приложение будет получать реальные данные из некоторого источника, например файла. Your application would obtain real data from some source, such as a file. Оператор вставки архива ардата ( The arData archive’s insertion operator (

«Заголовок», указывающий природу данных (в данном случае значение переменной bValue и количество копий, которые будут отправлены). A «header» that specifies the nature of the data (in this case, the value of the bValue variable and how many copies will be sent).

Для этого примера оба элемента создаются случайным образом. Both items are generated randomly for this example.

Указанное количество копий данных. The specified number of copies of the data.

Внутренний for цикл отправляет bValue указанное число раз. The inner for loop sends bValue the specified number of times.

Строка с именем стртекст , которую получатель отображает пользователю. A string called strText that the receiver displays to its user.

Для приема функция работает аналогично, за исключением того, что она использует оператор извлечения архива ( >> ) для получения данных из архива. For receiving, the function operates similarly, except that it uses the archive’s extraction operator (>>) to get data from the archive. Принимающее приложение проверяет полученные данные, отображает окончательное сообщение «получено», а затем отправляет сообщение с текстом «Отправлено» для отображения отправляющего приложения. The receiving application verifies the data it receives, displays the final «Received» message, and then sends back a message that says «Sent» for the sending application to display.

В этой модели взаимодействия слово «получено», сообщение, отправленное в переменной стртекст , предназначено для вывода на другом конце связи, поэтому оно указывает принимающему пользователю, что было получено определенное количество пакетов данных. In this communications model, the word «Received», the message sent in the strText variable, is for display at the other end of the communication, so it specifies to the receiving user that a certain number of packets of data have been received. Получатель отвечает со сходной строкой с текстом «Отправлено» для отображения на экране исходного отправителя. The receiver replies with a similar string that says «Sent», for display on the original sender’s screen. Получение обеих строк означает, что произошла успешная связь. Receipt of both strings indicates that successful communication has occurred.

Читайте также:  Mac os замена файлов

При написании клиентской программы MFC для взаимодействия с установленными серверами (не MFC) не отправляйте объекты C++ через архив. If you are writing an MFC client program to communicate with established (non-MFC) servers, do not send C++ objects through the archive. Если сервер не является приложением MFC, которое понимает типы объектов, которые требуется отправить, он не сможет получать и десериализовать объекты. Unless the server is an MFC application that understands the kinds of objects you want to send, it won’t be able to receive and deserialize your objects. Пример в статье сокеты Windows: порядок байтов показывает связь этого типа. An example in the article Windows Sockets: Byte Ordering shows a communication of this type.

Дополнительные сведения см. в разделе Спецификация сокетов Windows: хтонл, хтонс, нтохл, нтохс. For more information, see Windows Sockets Specification: htonl, htons, ntohl, ntohs. Кроме того, дополнительные сведения см. в следующих статьях: Also, for more information, see:

Сокеты Windows. Использование сокетов с архивами Windows Sockets: Using Sockets with Archives

В этой статье описывается модель программирования CSocket. This article describes the CSocket programming model. Класс CSocket предоставляет поддержку сокетов на более высоком уровне абстракции, чем класс CAsyncSocket. Class CSocket supplies socket support at a higher level of abstraction than does class CAsyncSocket. CSocket использует версию протокола сериализации MFC для передачи данных в объект сокета и обратно через объект MFC CArchive . CSocket uses a version of the MFC serialization protocol to pass data to and from a socket object through an MFC CArchive object. CSocket обеспечивает блокировку (при управлении фоновой обработкой сообщений Windows) и предоставляет доступ к CArchive , который управляет множеством аспектов взаимодействия, которые необходимо выполнить самостоятельно с помощью необработанного API или класса CAsyncSocket . CSocket provides blocking (while managing background processing of Windows messages) and gives you access to CArchive , which manages many aspects of the communication that you would have to do yourself using either the raw API or class CAsyncSocket .

Класс можно использовать в CSocket качестве более удобной версии CAsyncSocket , но простейшая модель программирования — использовать CSocket с CArchive объектом. You can use class CSocket by itself, as a more convenient version of CAsyncSocket , but the simplest programming model is to use CSocket with a CArchive object.

Дополнительные сведения о том, как работает реализация сокетов с архивами, см. в разделе сокеты Windows: как работают сокеты с архивами. For more information about how the implementation of sockets with archives works, see Windows Sockets: How Sockets with Archives Work. Пример кода см. в разделе сокеты Windows: последовательность операций и сокеты Windows: пример сокетов с использованием архивов. For example code, see Windows Sockets: Sequence of Operations and Windows Sockets: Example of Sockets Using Archives. Дополнительные сведения о некоторых функциях, которые можно получить, путем наследования собственных классов из классов Sockets, см. в разделе сокеты Windows: наследование от классов сокетов. For information about some of the functionality you can gain by deriving your own classes from the sockets classes, see Windows Sockets: Deriving from Socket Classes.

При написании клиентской программы MFC для взаимодействия с установленными серверами (не MFC) не отправляйте объекты C++ через архив. If you are writing an MFC client program to communicate with established (non-MFC) servers, do not send C++ objects through the archive. Если сервер не является приложением MFC, которое понимает типы объектов, которые требуется отправить, он не сможет получать и десериализовать объекты. Unless the server is an MFC application that understands the kinds of objects you want to send, it will not be able to receive and deserialize your objects. Дополнительные сведения о теме взаимодействия с приложениями, не относящимися к MFC, см. в статье порядок следования байтов в Windows Sockets. For related material on the subject of communicating with non-MFC applications, also see the article Windows Sockets: Byte Ordering.

Модель программирования CSocket The CSocket Programming Model

Использование CSocket объекта включает в себя создание и связывание нескольких объектов классов MFC. Using a CSocket object involves creating and associating together several MFC class objects. В описанной ниже процедуре каждый шаг принимается как сокет сервера, так и клиентский сокет, за исключением шага 3, в котором каждый тип сокета требует другого действия. In the general procedure below, each step is taken by both the server socket and the client socket, except for step 3, in which each socket type requires a different action.

Во время выполнения серверное приложение, как правило, запускается первым и ожидает, когда клиентское приложение ищет подключение. At run time, the server application usually starts first to be ready and «listening» when the client application seeks a connection. Если сервер не готов, когда клиент пытается подключиться, пользовательское приложение обычно попытается повторить попытку подключения позже. If the server is not ready when the client tries to connect, you typically require the user application to try connecting again later.

Читайте также:  Chromium browser linux 32 bit

Настройка обмена данными между сокетом сервера и сокетом клиента To set up communication between a server socket and a client socket

Создайте объект CSocket . Construct a CSocket object.

Используйте объект для создания базового маркера сокета . Use the object to create the underlying SOCKET handle.

Для CSocket клиентского объекта обычно следует использовать параметры по умолчанию для создания, если только не требуется сокет датаграммы. For a CSocket client object, you should normally use the default parameters to Create, unless you need a datagram socket. Для CSocket объекта сервера необходимо указать порт в Create вызове. For a CSocket server object, you must specify a port in the Create call.

CArchive не работает с сокетами датаграмм. CArchive does not work with datagram sockets. Если вы хотите использовать CSocket для сокета датаграмм, необходимо использовать класс так же, как и при использовании CAsyncSocket , то есть без архива. If you want to use CSocket for a datagram socket, you must use the class as you would use CAsyncSocket , that is, without an archive. Так как датаграммы ненадежны (не гарантированно поступают и могут быть повторены или получены из последовательности), они не совместимы с сериализацией через архив. Because datagrams are unreliable (not guaranteed to arrive and may be repeated or out of sequence), they are not compatible with serialization through an archive. Предполагается, что операция сериализации будет надежно и последовательно завершена. You expect a serialization operation to complete reliably and in sequence. При попытке использовать CSocket с CArchive объектом для датаграммы утверждение MFC завершается ошибкой. If you try to use CSocket with a CArchive object for a datagram, an MFC assertion fails.

Если сокет является клиентом, вызовите CAsyncSocket:: Connect , чтобы подключить объект сокета к сокету сервера. If the socket is a client, call CAsyncSocket::Connect to connect the socket object to a server socket.

Если сокет является сервером, вызовите метод CAsyncSocket:: Listen , чтобы начать прослушивание попыток подключения от клиента. If the socket is a server, call CAsyncSocket::Listen to begin listening for connect attempts from a client. После получения запроса на подключение примите его, вызвав CAsyncSocket:: Accept. Upon receiving a connection request, accept it by calling CAsyncSocket::Accept.

Accept Функция-член принимает ссылку на новый пустой CSocket объект в качестве параметра. The Accept member function takes a reference to a new, empty CSocket object as its parameter. Этот объект необходимо создать перед вызовом метода Accept . You must construct this object before you call Accept . Если этот объект сокета выходит за пределы области действия, соединение закрывается. If this socket object goes out of scope, the connection closes. Не вызывайте Create этот новый объект сокета. Do not call Create for this new socket object.

Создайте объект CSocketFile , связав CSocket с ним объект. Create a CSocketFile object, associating the CSocket object with it.

Создайте объект CArchive для загрузки (получения) или хранения (отправки) данных. Create a CArchive object for either loading (receiving) or storing (sending) data. Архив связан с CSocketFile объектом. The archive is associated with the CSocketFile object.

Помните, что не CArchive работает с сокетами датаграмм. Keep in mind that CArchive does not work with datagram sockets.

Используйте CArchive объект для передачи данных между клиентскими и серверными сокетами. Use the CArchive object to pass data between the client and server sockets.

Помните, что данный CArchive объект перемещает данные только в одном направлении: для загрузки (получения) или сохранения (отправки). Keep in mind that a given CArchive object moves data in one direction only: either for loading (receiving) or storing (sending). В некоторых случаях будут использоваться два CArchive объекта: один для отправки данных, другой — для получения подтверждений. In some cases, you will use two CArchive objects: one for sending data, the other for receiving acknowledgments.

После принятия подключения и настройки архива можно выполнять такие задачи, как проверка паролей. After accepting a connection and setting up the archive, you can perform such tasks as validating passwords.

Удалите архив, файл сокета и объекты сокета. Destroy the archive, socket file, and socket objects.

Класс CArchive предоставляет IsBufferEmpty функцию члена, специально предназначенную для использования с классом CSocket . Class CArchive supplies the IsBufferEmpty member function specifically for use with class CSocket . Если буфер содержит несколько сообщений с данными, например, необходимо выполнить цикл до тех пор, пока все они не будут считаны и буфер не будет сброшен. If the buffer contains multiple data messages, for example, you need to loop until all of them are read and the buffer is cleared. В противном случае следующее уведомление о том, что данные для получения могут быть неограниченно отложенными. Otherwise, your next notification that there is data to be received may be indefinitely delayed. Используйте, IsBufferEmpty чтобы гарантировать получение всех данных. Use IsBufferEmpty to assure that you retrieve all data.

В статье сокеты Windows: последовательность операций иллюстрирует обе стороны этого процесса с примером кода. The article Windows Sockets: Sequence of Operations illustrates both sides of this process with example code.

Дополнительные сведения см. в разделе: For more information, see:

Оцените статью