Что касается дейтаграмм, то здесь нет реального клиента или сервера. Любая сторона, пытающаяся отправить сообщение, отвечает за передачу дейтаграмм другой стороне. Итак, в вашем коде все настройки неверны. Вы, очевидно, пытаетесь направить «сервер» (но на самом деле не сервер, а просто другой узел) для отправки вам через svaddr
, но это не так.
Для сокета дейтаграммы AF_UNIX
отправителю необходимо либо явно указать адрес получателя в вызове sendto
, либо сначала connect
свой сокет к адресу получателя. (В последнем случае он может использовать send
вместо sendto
, поскольку адрес партнера был указан с помощью connect
.)
Вы не можете указать отправителя адрес партнера в вызове recvfrom
. Аргумент адреса сокета в recvfrom
предназначен для возврата вам адреса, с которого была отправлена датаграмма. Все, что находится в этой переменной, будет перезаписано при успешном возврате из recvfrom
.
. Односторонние программы одноранговых дейтаграмм часто структурированы: «сервер» создает известный путь и связывается с ним, затем «клиент». "создает свою собственную конечную точку и связывается с it (создавая уникальный адрес сокета для себя), тогда клиент может sendto
известный сокет сервера. Сервер, используя recvfrom
для получения адреса клиента вместе с дейтаграммой, может затем использовать sendto
вместе с адресом для возврата сообщения клиенту (без необходимости connect
его сокета). Это обеспечивает своего рода парадигму клиент-сервер поверх принципиально равноправной ориентации сокета дейтаграммы.
Наконец, я должен упомянуть, что обычно рекомендуется использовать полностью указанные имена путей, чтобы гарантировать, что оба узла используют один и тот же адрес, даже если они запускаются из разных каталогов. (Обычно при AF_UNIX
адрес - это путь в файловой системе, используемый для «рандеву» между двумя узлами, поэтому без полного пути «some_socket» равно «./some_socket» в текущем рабочем каталоге. Некоторые Системы, такие как linux, также поддерживают абстрактное «скрытое» пространство имен, для которого не требуется полный путь, но вы должны использовать начальный нулевой байт в имени, чтобы указать это.)