Dominio Unix: connect (): No existe tal archivo o directorio

Como se indica en el título, miconectar() la llamada a un socket de tipo de dominio Unix con una dirección correspondiente da como resultado el errorENOENT: no existe tal archivo o directorio.

Los dos zócalos se inicializan correctamente y los archivos de zócalo se crean y se enlazan en consecuencia. Los sockets del servidor y del cliente se ejecutan en un proceso diferente, aunque el proceso del cliente es fork () - ed y execl () - ed. También es así como analizo la dirección para el cliente y el socket del servidor, que uso para configurar el socket del cliente. El proceso del servidor está utilizando pthreads.

Aquí está miconectar() intento:

    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;
    }

Probé diferentes valores para el tamaño, tales como:

//  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);

Sorprendentemente, todas las inicializaciones, excepto la última, dan como resultado unEINVAL: argumento inválido error paraconectar() y me sale elENOENT: no existe tal archivo o directorio Solo con el último. Incluso probé ejemplos completos de internet, pero sin éxito. Y, obviamente, intercambiando socklen_t con size_t oEn t no cambia nada

Ya he comprobado esto:

address.sun_path contiene la ruta correcta del archivo de socket a partir del directorio raízaddress.sun_path tiene la longitud de 61 caracteresaddress.sun_family se establece en AF_UNIX / AF_LOCALaddress.sun_family tiene el tamaño de 2 bytesNo hay errores al crear y enlazar ambos sockets.el socket del servidor está en estado de escuchasizeof (dirección) devuelve 110 como se supone que es

Ahora me preguntaba por qué el ejemplo de la página de manual no estaba funcionando y si había cambios que no se actualizaron enlinux.die.net owww.kernel.org. Mi sistema operativo es Debian Squeeze si es relevante.

¿Alguna idea de lo que estoy haciendo mal? ¿Y como resolverlo? Si necesita más código o tiene preguntas, no dude en preguntarme (aunque no es necesario que lo diga, pero esta es mi primera publicación aquí>. <).

por cierto, lo siento por mi mal inglés

Actualización 2

Resuelto Voy a publicarlo en una respuesta adicional a continuación por claridad.

Respuestas a la pregunta(2)

Su respuesta a la pregunta