Как должен каждый разъединять повышение:: asio:: IP:: udp:: сокет?

Не в широком масштабе. У меня никогда не было проблемы с ним в настольной разработке, если, как Martin заявляет, Вы не используете его в глупом месте. Я услышал, что у большого количества людей есть совершенно безрассудные страхи о его производительности в настольной разработке.

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

10
задан Torleif 3 August 2009 в 14:23
поделиться

1 ответ

Поскольку это несколько вопросов, я сделаю все возможное, чтобы ответить на каждую часть, чтобы вы остались довольны:

1) По моему опыту с сокетами ASIO, деструктор обрабатывает закрытие разъем. Однако я имел дело только с TCP-сокетами. Лучший способ проверить это - просто взглянуть на код деструктора, чтобы увидеть, делает ли он что-нибудь похожее на закрытие. Я знаю, что код Boost может быть немного сложным для выполнения, поэтому может быть проще просто создать небольшой образец программы, который открывает сокет UDP, а затем разрушает его. Таким образом, вы можете пошагово выполнять код в отладчике, чтобы следовать логике.

Поскольку разработчики Boost учли это для сокетов TCP, мне трудно представить, что они не сделали бы то же самое для сокетов UDP.

2) Вызывайте shutdown () только тогда, когда чувствуете, что необходимо предотвратить выполнение каким-либо кодом в будущем recv и / или send сокета. Обычно это не требуется, хотя я видел, как он использовался в сокетах TCP, чтобы заставить сокет отправлять RST , когда он закрыт (в отличие от «плавного» завершения по умолчанию, когда обрабатываются ожидающие отправки).

3) Сокеты можно рассматривать как двухканальную форму связи: один для чтения, другой для отправки. Вы можете выключить любой из них независимо от другого, и вы можете продолжать использовать один канал, когда другой выключен (т. Е. Вы все еще можете принимать после выключения для отправки и наоборот). Закрытие сокета идентично вызову выключения как для recv, так и для отправки.

Завершение работы на recv просто не позволяет вашему коду читать больше данных. Если вы попытаетесь это сделать, вы получите ошибку сокета. Аналогичным образом, если другая сторона соединения попытается отправить вам данные, она получит сообщение об ошибке (извините, что снова переключился на мир TCP, но я считаю, что RST получает ответ отправителю).

Завершение работы для отправки также предотвращает отправку вашим кодом каких-либо данных. Если память мне не изменяет, это выглядит идентично тому, что происходит, когда вы закрываете сокет (отправляется пакет нулевой длины, чтобы сигнализировать другой стороне, что конкретный канал был отключен). Любые попытки отправки в будущем вернут ошибку.

4) Вам нужно будет проверить свои документы, чтобы знать наверняка. MSDN даст вам довольно хорошее представление, хотя я не знаю,

10
ответ дан 4 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: