tcp client что это
Использование служб TCP
Протокол TCP устанавливает соединение с удаленной конечной точкой, а затем использует его для отправки и получения пакетов данных. Протокол TCP отвечает за отправку пакетов данных в конечную точку и их сборку в правильном порядке после доставки.
Чтобы установить подключение TCP, необходимо знать адрес сетевого устройства, в котором размещается нужная служба, и порт TCP, который служба использует для обмена данными. Номера портов для основных служб определяются организацией IANA («Администрация адресного пространства Интернет»). См. документ Service Name and Transport Protocol Port Number Registry (Реестр названий служб и номеров портов транспортных протоколов). Службы, отсутствующие в списке IANA, могут иметь номера портов в диапазоне от 1024 до 65535.
В приведенном ниже примере показано, как настроить TcpClient для подключения к серверу времени через порт TCP 13:
TcpListener используется для отслеживания входящих запросов на порте и последующего создания объекта Socket или TcpClient, который управляет подключением к клиенту. Метод Start включает прослушивание порта, а метод Stop отключает его. Метод AcceptTcpClient принимает входящие запросы на подключение и создает TcpClient для их обработки, а метод AcceptSocket делает то же самое, но создает Socket.
В приведенном ниже примере показано создание сервера времени в сети с использованием TcpListener для наблюдения за портом TCP 13. При получении входящего запроса на подключение сервер времени сообщает в ответ текущую дату и время с сервера узла.
Класс TcpClient
В отличие от класса Socket, в котором для отправки и получения данных применяется побайтовый подход, классы TcpClient и TcpListener придерживаются потоковой модели. В этих классах все взаимодействие между клиентом и сервером базируется на потоке с использованием класса NetworkStream. Однако при необходимости можно работать с байтами.
Класс TcpClient обеспечивает TCP-сервисы для соединений на стороне клиента. Он построен на классе Socket и обеспечивает TCP-сервисы на более высоком уровне — в классе TcpClient есть закрытый объект данных m_ClientSocket, используемый для взаимодействия с сервером TCP. Класс TcpClient предоставляет простые методы для соединения через сеть с другим приложением сокетов, отправки ему данных и получения данных от него. Наиболее важные члены класса TcpClient перечислены далее:
Свойство или метод | Тип | Описание |
---|---|---|
LingerState | LingerOption | Устанавливает или возвращает объект LingerOption, содержащий информацию о том, будет ли соединение оставаться открытым после закрытия сокета и как долго. |
NoDelay | bool | Указывает, будет ли сокет задерживать отправку и получение данных, если буфер, назначенный для отправки или получения данных, не заполнен. Если свойство имеет значение false, TCP задержит отправку пакета, пока не будет накоплен достаточный объем данных. Это средство помогает избежать неэффективной отправки через сеть слишком маленьких пакетов. |
ReceiveBufferSize | int | Задает размер буфера для входящих данных (в байтах). Это свойство используется при считывании данных из сокета. |
ReceiveTimeout | int | Задает время в миллисекундах, которое TCpClient будет ждать получения данных после инициирования этой операции. Если это время истечет, а данные не будут получены, возникнет исключение SocketException. |
SendBufferSize | int | Задает размер буфера для исходящих данных. |
SendTimeout | int | Задает время в миллисекундах, которое TcpClient будет ждать подтверждения числа байтов, отправленных удаленному хосту от базового сокета. При истечении времени SendTimeout порождается исключение SocketException. |
Close() | Закрывает TCP-соединение. | |
Connect() | Соединяется с удаленным хостом TCP. | |
GetStream() | Возвращает объект NetworkStream, используемый для передачи данных между клиентом и удаленным хостом. | |
Active | bool | Указывает, есть ли активное соединение с удаленным хостом. |
Client | Socket | Задает базовый объект Socket, используемый объектом TcpClient. Поскольку это защищенное свойство, к базовому сокету можно обращаться, если вы производите ваш класс от TcpClient. |
Создание экземпляра класса TcpClient
В классе TcpClient существуют три перегруженных конструктора:
Конструктор, используемый по умолчанию, инициализирует экземпляр TcpClient. Если экземпляр TcpClient создается так, то для установления соединения с удаленным хостом надо вызвать метод Connect().
Если использовать этот конструктор, то после создания объекта TcpClient, все-таки нужно вызвать метод Connect():
Параметр, переданный конструктору объекта TcpClient, является локальной конечной точкой, в то время как метод Connect() фактически соединяет клиента с сервером и поэтому принимает в качестве параметра удаленную конечную точку.
Последний перегруженный конструктор создает новый экземпляр класса TcpClient и устанавливает удаленное соединение с использованием в параметрах DNS-имени и номера порта:
Это самый удобный метод, он позволяет инициализировать TcpClient, разрешить DNS-имя и соединиться с хостом в одном простом шаге. Однако заметьте, что с помощью этого конструктора нельзя задать локальный порт, с которым желательно связаться.
Установка соединения с хостом
Создав экземпляр класса TcpClient, следующим шагом установим соединение с удаленным хостом. Для соединения клиента с хостом TCP предоставлен метод Connect(). Если для создания экземпляра TcpClient использовать конструктор по умолчанию или локальную конечную точку, то останется лишь вызвать этот метод, иначе, если конструктору были переданы имя хоста и номер порта, попытка вызова метода Connect() породит исключение. Существуют три перегруженных метода Connect():
Они достаточно просты, но, тем не менее, на коротких примерах продемонстрируем использование каждого перегруженного метода:
Передача объекта IPEndPoint, представляющего удаленную конечную точку, с которой надо соединиться:
Передача объекта IPAddress и номера порта:
Передача имени хоста и номера порта:
Если соединение будет неудачным или возникнут другие проблемы, порождается исключение SocketException:
Отправка и получение сообщений
Для обработки на уровне потока, как канал между двумя соединенными приложениями, используется класс NetworkStream. Прежде чем отправлять и получать любые данные, нужно определить базовый поток. Класс TcpClient предоставляет метод GetStream() исключительно для этих целей. С помощью базового сокета он создает экземпляр класса NetworkStream и возвращает его вызывающей программе. Следующий пример кода демонстрирует, как получить сетевой поток через метод GetStream():
Предположим, что newClient — это экземпляр TcpClient, а соединение с хостом уже установлено. Иначе будет порождено исключение InvalidOperation. Получив поток, используем методы Read() и Write() класса NetworkStream для чтения из приложения хоста и записи к нему. Метод Write() принимает три параметра: массив байтов, содержащий данные, которые надо отправить хосту, позицию в потоке, с которой хотим начать запись, и длину данных:
Метод Read() имеет точно такой же набор параметров — массив байтов для сохранения данных, которые считываются из потока, позицию начала считывания и число считываемых байтов:
Свойство ReceiveBufferSize класса TcpClient позволяет получить или установить размер (в байтах) буфера для чтения, поэтому используем его как размер массива байтов. Заметьте, что, устанавливая это свойство, мы не ограничиваем число байтов, которое можно считывать каждой операцией, поскольку при необходимости размер буфера будет динамически изменяться, но если задать размер буфера, это сократит накладные расходы.
Закрытие сокета TCP
После взаимодействия с сервером, чтобы освободить все ресурсы, следует вызвать метод Close():
Вот и все, что нужно, чтобы использовать класс TcpClient для взаимодействия с сервером.
Помимо этой основной функциональности имеются другие возможности. Если требуется обратиться к экземпляру сокета, базовому для объекта TcpClient, например для установки опций методом SetSocketOption(), можно использовать свойство Client, получая доступ к членам соответствующего объекта Socket. Можно также использовать свойство Client, чтобы сделать существующий объект Socket базовым сокетом для объекта TcpClient. Но поскольку это защищенный член класса TcpClient, прежде чем его использовать, наш класс должен наследовать класс TcpClient.
Свойство Client дает возможность защищенного доступа к закрытому члену m_ClientSocket, о котором упоминалось ранее. Класс TcpClient передает сделанные на нем вызовы аналогичному методу класса Socket после проверки параметров и инициализации экземпляра сокета. Объект m_ClientSocket создается в конструкторе, который вызывает закрытый метод initialize(), строящий новый объект Socket, и затем вызывает метод set_Client(), чтобы назначить его свойству Client. Этот метод также устанавливает булево значение m_Active, используемое для отслеживания состояния экземпляра Socket. Он также проверяет наличие излишних соединений объекта Socket и операций, требующих установления соединения.
В общем у сокетов есть масса опций, которые класс TcpClient не охватывает. Если нужно установить или получить какое-либо из этих свойств, не представленных в TcpClient (например, Broadcast или KeepAlive), необходимо унаследовать класс от TcpClient и использовать его член Client.
Tcp Client Класс
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет клиентские подключения для сетевых служб протокола TCP.
Примеры
В следующем примере кода устанавливается TcpClient соединение.
Комментарии
TcpClient Класс предоставляет простые методы для подключения, отправки и получения потоковых данных по сети в синхронном блокирующем режиме.
Для TcpClient подключения и обмена данными, TcpListener или, Socket созданный с помощью протокола TCP, ProtocolType необходимо прослушивать входящие запросы на подключение. Подключиться к этому прослушивателю можно одним из следующих двух способов:
Создайте TcpClient и вызовите один из трех доступных Connect методов.
Создайте TcpClient с помощью имени узла и номера порта удаленного узла. Этот конструктор будет автоматически пытаться установить соединение.
Если вы хотите отправить датаграммы без соединений в режиме синхронной блокировки, используйте UdpClient класс.
Примечания для тех, кто наследует этот метод
Конструкторы
Инициализирует новый экземпляр класса TcpClient.
Инициализирует новый экземпляр класса TcpClient с заданным семейством.
Инициализирует новый экземпляр класса TcpClient и связывает его с заданной локальной конечной точкой.
Инициализирует новый экземпляр класса TcpClient и подключает его к указанному порту заданного узла.
Свойства
Получает или задает значение, указывающее, установлено ли подключение.
Возвращает значение, указывающее количество полученных из сети и доступных для чтения данных.
Возвращает или задает базовый объект Socket.
Возвращает значение, указывающее, подключен ли основной объект Socket для объекта TcpClient к удаленному узлу.
Возвращает или задает значение Boolean, указывающее, разрешает ли объект TcpClient использовать порт только одному клиенту.
Получает или задает информацию о состоянии задержки связанного сокета.
Возвращает или задает значение, которое отключает задержку в том случае, когда буферы отправки и получения не заполнены.
Возвращает или задает размер буфера приема.
Возвращает или задает длительность временного интервала, в течение которого объект TcpClient будет ожидать получение данных после инициации операции чтения.
Возвращает или задает размер буфера отправки.
Возвращает или задает длительность временного интервала, в течение которого объект TcpClient будет ожидать успешного завершения операции отправки данных.
Методы
Начинает выполнение асинхронного запроса для подключения к удаленному узлу. Удаленный узел задается объектом IPAddress и номером порта (Int32).
Начинает выполнение асинхронного запроса для подключения к удаленному узлу. Удаленный узел задается массивом IPAddress и номером порта (Int32).
Начинает выполнение асинхронного запроса для подключения к удаленному узлу. Удаленный узел задается именем узла (String) и номером порта (Int32).
Удаляет данный экземпляр TcpClient и запрашивает закрытие базового подключения TCP.
Подключает клиента к удаленному TCP-узлу, используя указанный IP-адрес и номер порта.
Подключает клиента к удаленному TCP-узлу, используя указанный IP-адрес и номер порта.
Подключает клиента к удаленному TCP-узлу, используя указанную удаленную сетевую конечную точку.
Подключает клиента к указанному порту заданного узла.
Подключает клиента к удаленному TCP-узлу, используя заданный IP-адрес и номер порта в асинхронной операции.
Подключает клиента к удаленному TCP-узлу, используя заданный IP-адрес и номер порта в асинхронной операции.
Подключает клиента к удаленному TCP-узлу, используя заданные IP-адреса и номер порта в асинхронной операции.
Подключает клиента к удаленному TCP-узлу, используя заданные IP-адреса и номер порта в асинхронной операции.
Подключает клиента к удаленному TCP-узлу, используя указанную конечную точку в качестве асинхронной операции.
Подключает клиента к удаленному TCP-узлу, используя указанную конечную точку в качестве асинхронной операции.
Подключает клиента к указанному TCP-порту заданного узла в асинхронной операции.
Подключает клиента к указанному TCP-порту заданного узла в асинхронной операции.
Освобождает все управляемые и неуправляемые ресурсы, используемые TcpClient.
Освобождает неуправляемые ресурсы, используемые объектом TcpClient, а при необходимости освобождает также управляемые ресурсы.
Завершает ожидающую асинхронную попытку на подключение.
Определяет, равен ли указанный объект текущему объекту.
Освобождает ресурсы, используемые классом TcpClient.
Служит хэш-функцией по умолчанию.
Возвращает объект NetworkStream, используемый для отправки и получения данных.
Возвращает объект Type для текущего экземпляра.
Создает неполную копию текущего объекта Object.
Возвращает строку, представляющую текущий объект.
Явные реализации интерфейса
Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из программного кода.
Освобождает все ресурсы, занятые модулем TcpClient.
STM Урок 134. LAN8742A. LWIP. SOCKET. TCP Client
Продолжаем работать с интерфейсом SOCKET с протоколом TCP и сегодня мы попытаемся создать клиент. Как мы убедились на примере клиента для интерфейса NETCONN, что с клиентом работать не только не легче, чем с сервером, но ещё и тяжелее.
В качестве сервера теперь у нас, наоборот, будет ПК.
Проект за основу мы возьмём с прошлого урока с именем LAN8742_TCP_SERVER_SOCKET и теперь у него, соответственно, будет имя LAN8742_TCP_CLIENT_SOCKET.
Откроем наш проект в Cube MX, сначала в настройки ETH и поменяем там MAC-адрес, так как, я думаю вы уже догадались, что мы будем наш клиент затем соединять с сервером на отладочной плате
В настройках LWIP изменим сетевой адрес
Сгенерируем проект для System Workbench и откроем его там. Установим уровень оптимизации в 1 и уберём при наличии отладочные настройки.
В файле main.c в функции main() исправим шапку
Так как не на всех платах имеется память SDRAM, то по просьбам посетителей ресурса попытаемся обойтись без его использования для массивов.
Поэтому удалим данные глобальные указатели
unsigned char *out_buffer;
unsigned char *send_ws_buf;
Вместо этого добавим глобальные массивы в обычной ОЗУ
Tcp Client Class
Definition
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Provides client connections for TCP network services.
Examples
The following code example establishes a TcpClient connection.
Remarks
The TcpClient class provides simple methods for connecting, sending, and receiving stream data over a network in synchronous blocking mode.
In order for TcpClient to connect and exchange data, a TcpListener or Socket created with the TCP ProtocolType must be listening for incoming connection requests. You can connect to this listener in one of the following two ways:
Create a TcpClient and call one of the three available Connect methods.
Create a TcpClient using the host name and port number of the remote host. This constructor will automatically attempt a connection.
If you want to send connectionless datagrams in synchronous blocking mode, use the UdpClient class.
Notes to Inheritors
To send and receive data, use the GetStream() method to obtain a NetworkStream. Call the Write(Byte[], Int32, Int32) and Read(Byte[], Int32, Int32) methods of the NetworkStream to send and receive data with the remote host. Use the Close(Int32) method to release all resources associated with the TcpClient.
Constructors
Initializes a new instance of the TcpClient class.
Initializes a new instance of the TcpClient class with the specified family.
Initializes a new instance of the TcpClient class and binds it to the specified local endpoint.
Initializes a new instance of the TcpClient class and connects to the specified port on the specified host.
Properties
Gets or sets a value that indicates whether a connection has been made.
Gets the amount of data that has been received from the network and is available to be read.
Gets or sets the underlying Socket.
Gets a value indicating whether the underlying Socket for a TcpClient is connected to a remote host.
Gets or sets a Boolean value that specifies whether the TcpClient allows only one client to use a port.
Gets or sets information about the linger state of the associated socket.
Gets or sets a value that disables a delay when send or receive buffers are not full.
Gets or sets the size of the receive buffer.
Gets or sets the amount of time a TcpClient will wait to receive data once a read operation is initiated.
Gets or sets the size of the send buffer.
Gets or sets the amount of time a TcpClient will wait for a send operation to complete successfully.
Methods
Begins an asynchronous request for a remote host connection. The remote host is specified by an IPAddress and a port number (Int32).
Begins an asynchronous request for a remote host connection. The remote host is specified by an IPAddress array and a port number (Int32).
Begins an asynchronous request for a remote host connection. The remote host is specified by a host name (String) and a port number (Int32).
Disposes this TcpClient instance and requests that the underlying TCP connection be closed.
Connects the client to a remote TCP host using the specified IP address and port number.
Connects the client to a remote TCP host using the specified IP addresses and port number.
Connects the client to a remote TCP host using the specified remote network endpoint.
Connects the client to the specified port on the specified host.
Connects the client to a remote TCP host using the specified IP address and port number as an asynchronous operation.
Connects the client to a remote TCP host using the specified IP address and port number as an asynchronous operation.
Connects the client to a remote TCP host using the specified IP addresses and port number as an asynchronous operation.
Connects the client to a remote TCP host using the specified IP addresses and port number as an asynchronous operation.
Connects the client to a remote TCP host using the specified endpoint as an asynchronous operation.
Connects the client to a remote TCP host using the specified endpoint as an asynchronous operation.
Connects the client to the specified TCP port on the specified host as an asynchronous operation.
Connects the client to the specified TCP port on the specified host as an asynchronous operation.
Releases the managed and unmanaged resources used by the TcpClient.
Releases the unmanaged resources used by the TcpClient and optionally releases the managed resources.
Ends a pending asynchronous connection attempt.
Determines whether the specified object is equal to the current object.
Frees resources used by the TcpClient class.
Serves as the default hash function.
Returns the NetworkStream used to send and receive data.
Gets the Type of the current instance.
Creates a shallow copy of the current Object.
Returns a string that represents the current object.
Explicit Interface Implementations
This API supports the product infrastructure and is not intended to be used directly from your code.
Releases all resources used by the TcpClient.