Не удается подключиться к «абстрактному» unix-сокету Linux

. Я пытаюсь использовать сокеты UNIX для связи между потоками -. Программа предназначена только для работы в Linux. Чтобы избежать создания файлов сокетов, я хотел использовать «абстрактные» сокеты, как описано в unix (7 ).

Однако я не могу подключиться к этим разъемам. Однако все работает, если я использую сокеты «pathname».

Вот код (Я не цитировал обработку ошибок, но это сделано ):резьба #1:

int log_socket = socket(AF_LOCAL, SOCK_STREAM, 0);
struct sockaddr_un logaddr;
socklen_t sun_len = sizeof(struct sockaddr_un);
logaddr.sun_family = AF_UNIX;
logaddr.sun_path[0] = 0;
strcpy(logaddr.sun_path+1, "futurama");
bind(log_socket, &logaddr, sun_len);
listen(log_socket, 5);
accept(log_socket, &logaddr, &sun_len);
... // send - receive

резьба #2:

struct sockaddr_un tolog;
int sock = socket(AF_LOCAL, SOCK_STREAM, 0);
tolog.sun_family = AF_UNIX;
tolog.sun_path[0] = 0;
strcpy(tolog.sun_path+1, "futurama");
connect(sock, (struct sockaddr*)&tolog, sizeof(struct sockaddr_un));

Если все, что я делаю в приведенном выше коде, это изменяю путь солнца _так, чтобы он не имел ведущего \0, все работает идеально.

вывод трассировки:

t1: socket(PF_FILE, SOCK_STREAM, 0)         = 0
t1: bind(0, {sa_family=AF_FILE, path=@"futurama"}, 110)
t1: listen(0, 5)
t2: socket(PF_FILE, SOCK_STREAM, 0) = 1
t2: connect(1, {sa_family=AF_FILE, path=@"futurama"}, 110 <unfinished...>
t2: <... connect resumed> )     = -1 ECONNREFUSED (Connection refused)
t1: accept(0,  <unfinished...>

Я знаю, что соединение происходит перед принятием, это не проблема (Я пытался убедиться, что принятие ()вызывается перед соединением (), тот же результат. Кроме того, все в порядке, если сокет в любом случае имеет значение «pathname» ).

10
задан Pawel Veselov 24 July 2012 в 23:39
поделиться