LINUX.ORG.RU

Проясните вопросик про UNIX socket.


0

1

Когда создается PF_UNIX и SOCK_DGRAM сокет, то при чтении из него recvfrom выдает не имеющую смысла информацию об отправителе пакета. В таком случае такой сокет не может быть использован для двустороннего обмена информацией между одним сервером и несколькими клиентами? Или я чего-то не понимаю?

проблемы аутентификации отправителя это проблема твоего протокола, а не транспорта. Из вспомогательных инструментов есть

1. SCM_CREDENTIALS (SCM_CREDS в bsd..?) в man 7 unix

2. стандартные права доступа к юникс сокетам в фс.

mashina ★★★★★
()
Ответ на: комментарий от mashina

Насчет SCM_CREDENTIALS я было хотел отдельную тему создать. Но, если ты с этим работал, то может прояснишь заодно пару вопросиков. При беглом ознакомлении с манами, что-то не могу понять. Ведь через один сокет передаются и полезные данные и Ancillary Messages со всякими credentials. Но для отправки и према того и другого используются разные системные вызовы.Получается протоколом обмена на прикладном уровне должно быть четко установлено в какие моменты, например, сервер должен пытаться вычитывать из сокета данные, или же credentials mtssages? Так что ли?

zloy_starper ★★★
() автор топика
Ответ на: комментарий от true_admin

Хм. Т.е. клиент должен создать на своем конце сокет и посылать с использованием его адреса. Чудно как-то. А по окончании работы клиент должен будет еще и сам свой сокет удалить?

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

А по окончании работы клиент должен будет еще и сам свой сокет удалить?

Хотелось бы. Есть проблема добавить две строчки кода? Впрочем, возможно, старый сокет перезатрётся если открыть новый. Лень читать и проверять.

true_admin ★★★★★
()
Ответ на: комментарий от zloy_starper

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

Данные идут вместе с AM, вызов sendmsg() берёт и данные (msg_iov), и AM (msg_control). И сервер получает их тоже вместе через recvmsg(), можно обратотать всё по факту получения.

mashina ★★★★★
()
Ответ на: комментарий от zloy_starper

и сам свой сокет удалить?

Делай unlink, перед тем как. Это одна строка всего лишь.

Смотри как сдесь сделано. Но там правда тср. https://github.com/troydhanson/misc/blob/master/unixdomain/srv.c

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Ответ на: комментарий от true_admin

старый сокет перезатрётся

Для SOCK_STREAM вроде нет, но я не уверен. Для DGRAM не знаю.

nanoolinux ★★★★
()
Ответ на: комментарий от mashina

А как оперировать с msg_iov структурой? Скажем, выполнив recvmsg, я получу данные, распределенные в msg_iov. Забрав их себе, нужно очистить память в msg_iov, или эта память будет использоваться/перераспределяться при вызове очередных recvmsg?

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

не нужно лениться читать мануалы, в данном случае за детялями отсылают к readv(). Все буфера должен сам приготовить в msg_iov и msg_control, recvmsg() их не выделяет.

mashina ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.