In article <7ok1dt$18n$1@ddt.demos.su>,
"Maxim A.Shemanaryov" <max@mera.ru> writes:
> Открываю UDP-сокет и хочу в него послать датаграмму. Сокет работает
> только на передачу.
> Вопрос: Обязательно в _данном_случае_ ли делать bind?
> В Linux-e работает так: Если bind не делать, то на другом конце
> я получаю датаграмму с первым свободным номером порта, то есть,
> такое впечатление, что система сама назначает порт для посылки
> (как в TCP). В книжках везде рисуют один и тот же алгоритм с bind.
> Если же его делать, то это неудобно - второй экземпляр
> приложения с тем_же_самым портом говорит Can't bind socket
> (что и понятно). Итак, обязательно ли для отсылки (и только для отсылки)
> делать bind? Hасколько это переносимо в пределах Unix?
В манах (например, Солярисных) написано что все так и есть: если bind не
сделан, то локальный порт будет назначен системой, причем независимо от
протокола (tcp/udp/...). Hа самом деле это правда для IP протоколов,
и *неправда* для unix domain sockets. То есть через незаbindеный unix
domain послать датаграмму тоже можно, то при этом локальный адрес (в
данном случае имя) назначено *не* будет. То есть когда на том конце
возьмут адрес отправителя из recvfrom(), по этому адресу отправлять
ответ бесполезно, там мусор.
А для UDP документированное поведение действительно работает, то
есть можно не делать bind() перед sendto().
Eugene
--- ifmail v.2.14dev3
* Origin: Average (2:5020/400)