net.tcp: соединения и передачи
TCP Описывает структуру результата, ответственность за частичный перенос и отключение.
Wave Foundation
Проверить результаты подключения
std::net::tcp
tcp_connect_addr(addr: SocketAddr) -> NetResult<TcpStream>
tcp_bind_loopback(port: u16) -> NetResult<TcpListener>
tcp_accept(listener: TcpListener) -> NetResult<TcpStream>
tcp_read(stream: TcpStream, buf: ptr<u8>, size: i64) -> i64
tcp_write_all(stream: TcpStream, buf: ptr<u8>, size: i64) -> i64
tcp_read_exact(stream: TcpStream, buf: ptr<u8>, size: i64) -> i64
tcp_close(stream: TcpStream) -> NetError
tcp_close_listener(listener: TcpListener) -> NetError
Функция связи NetResult<T> имеет ok, value и error. Используйте value только в случае успеха. NetError содержит нормализованную классификацию ошибок и native_code, а успех можно проверить с помощью error.kind == NET_ERROR_NONE. Эта константа взята из std::net::error.
Подключенный поток и поток, полученный с помощью accept, должны быть закрыты соответственно. Закрытие прослушивателя не означает закрытие всех потоков, которые он уже принял. Не закрывайте каждую копию структуры.
TCP не сохраняет границы сообщения.
Не думайте, что все, что вы напишете однажды, вернется к вам, как только вы это прочтете. Протокол должен быть ограничен префиксом длины, разделителем или фиксированной длиной. Фиксированная длина обрабатывается tcp_read_exact, а потоки неизвестной длины обрабатываются итерациями чтения и обработкой EOF.
Отрицательные числа — это ошибки, а при чтении положительной длины 0 — это конец другого конца. write_all Некоторые данные могли быть переданы до сбоя. Если вы повторно передаете тот же контент с самого начала, он может дублироваться.
Ожидание и ограничения по времени
Функция по умолчанию blocking может долго ждать ответа другой стороны. Для программ, требующих ограничения по времени, выберите серию tcp_connect_addr_timeout, tcp_read_timeout, tcp_write_timeout. Проверьте миллисекундный фактор и последствия ошибок, а также спроектируйте маршрут, при котором другая сторона не отвечает. В асинхронном режиме используется task вместе с соответствующей асинхронной сетью API.
поиск адреса · Завершенный локальный клиент
Критерии выбора функции чтения
| требуется действие | функция | значение для проверки |
|---|---|---|
| Прочитайте некоторые из поступивших данных | tcp_read |
Отрицательная ошибка, нулевое завершение, положительное количество байтов |
| Прочитайте определенную длину | tcp_read_exact |
Прочитана ли длина запроса полностью? |
| Отправить данный контент в конец | tcp_write_all |
Длина запроса и возвращаемое значение |
| Ограничение времени ожидания | timeout Серия | Возвращаемый результат и ошибка timeout |
Для протокола с четырехбайтовым полем длины, за которым следует тело, сначала прочитайте полное поле длины, убедитесь, что длина не превышает разрешенный максимум, а затем выделите место для тела. Не выделяйте большие объемы памяти из непроверенной длины, предоставленной партнером.
Когда закрывать соединение
Даже если функция чтения возвращает 0, ресурсы локального потока остаются. После прочтения позвоните по номеру tcp_close. Если вы используете один и тот же путь очистки даже после ошибки передачи, вы не забудете закрыть нормальный и неудавшийся пути.
Слушатель — это ресурс, который получает новые соединения, а поток — это коммуникационный ресурс, который уже подключен. При создании сервера вы управляете обоими типами. Каждый раз, когда accept завершается успешно, создается новый поток, поэтому мы закрываем его после обработки и закрываем прослушиватель после завершения итерации принятия сервером.
Попробуйте сами
Местная клиентская практика TCP содержит полный код сервера и клиента. Вы можете отличить поиск адреса от сбоя соединения, сравнив случаи, когда сервер запускается первым, когда сервер отсутствует и когда номер порта отличается.