Теперь, если я [не connect()
сокет], любое сообщение, которое я посылаю через этот rsfd, также будет получено само по себе.
Сначала отметим, что необработанные сокеты являются расширением POSIX.Linux предлагает их, и я думаю, что другие системы делают то же самое, но детали их поведения не обязательно будут одинаковыми для всех реализаций.
С учетом сказанного, проблема, вероятно, заключается в том, что вы не bind()
ingВаш сокет на любой адрес.Например, в Linux в документах для необработанных сокетов обратите внимание, что
Необработанный сокет может быть связан с конкретным локальным адресом с помощью вызова bind(2)
. Если он не связан, все пакеты с указанным IP-протоколом принимаются.
(выделение добавлено.) В системе, где необработанные сокеты имеют такое поведение, если вы 'повторная отправка пакетов на IP-адрес обратной связи через необработанный IP-сокет, который не связан и не подключен, тогда да, исходный сокет получит их или, по крайней мере, может это сделать.
Неясно, почему подключение сокета решает проблемуили почему это вообще успешно.Поведение connect()
не определено для типов сокетов, отличных от стандартных, SOCK_DGRAM
, SOCK_STREAM
и SOCK_SEQPACKET
.Однако наблюдаемое вами поведение согласуется с тем, что connect()
оказывает влияние на необработанные сокеты, как это влияет на сокеты дейтаграмм, которые также не имеют соединения:
Если сокет sockfd
имеет тип SOCK_DGRAM
, тогда addr
- это адрес, по которому дейтаграммы отправляются по умолчанию, и единственный адрес, с которого принимаются дейтаграммы.
Вместо того, чтобы полагаться на это обнаруженное поведениетем не менее, я предлагаю следовать документированной (по крайней мере в Linux) процедуре привязки сокета к адресу (включая порт) и связи с ним по этому адресу.