как сказано в заголовке, мой коннект()вызов сокета типа домена unix с соответствующим адресом приводит к ошибке ENOENT :нет такого файла или каталога .
Два сокета правильно инициализированы, и файлы сокетов созданы и привязаны соответствующим образом. Серверные и клиентские сокеты выполняются в разных процессах, хотя клиентский процесс является fork ()-ed и execl ()-ed. Точно так же я анализирую адрес клиентского и серверного сокетов, которые я использую для настройки клиентского сокета. Серверный процесс использует pthreads.
Вот мой коннект()попытка:
struct sockaddr_un address;
address.sun_family = AF_UNIX;
memcpy(address.sun_path, filepath.c_str(), filepath.length());
address.sun_path[filepath.length()] = '\0';
if(-1 == connect(this->unix_domain_descriptor_.descriptor(), \
(struct sockaddr*)&address, \
size))
{
global::ExitDebug(-1, "connect() failed", __FILE__, __LINE__);
return -1;
}
Я пробовал разные значения размера, например:
// this is from unix(7) man page. It doesn't work neither with nor without "+1"
socklen_t size = offsetof(struct sockaddr_un, sun_path);
size += strlen(address.sun_path) + 1;
// this is from one of my books about linux programming
socklen_t size = sizeof(address);
// this is from a sample code which I found at the internet
socklen_t size = sizeof(address.sun_family) + strlen(address.sun_path);
// Update 1:
socklen_t size = SUN_LEN(&address);
// this is what I tried out after looking into the declaration
// of struct sockaddr_un
socklen_t size = strlen(address.sun_path);
Удивительно, но все инициализации, кроме последней, приводят к ошибке EINVAL :неверный аргумент для connect()и я получаю ENOENT :нет такого файла или каталога только с последним. Я даже пробовал целые примеры из Интернета, но безуспешно. И очевидно, что замена socklen _t на size _t или int ничего не меняет.
Я уже проверил это:
Теперь мне было интересно, почему не работает пример man-страницы и были ли изменения, которые не были обновлены на linux.die.net или www.kernel.org . Моя ОС — Debian Squeeze, если это актуально.
Любые идеи, что я делаю неправильно? И как это решить? Если вам нужно больше кода или у вас есть вопросы, то не стесняйтесь спрашивать меня (хотя, вероятно, мне не нужно это указывать, но это мой первый пост здесь >.
Кстати, извините за мой плохой английский
Решено. Я опубликую это в дополнительном ответе ниже из ясности.