Domena Unix: connect (): Brak takiego pliku lub katalogu

jak podano w tytule, mójpołączyć() wywołanie do gniazda typu domeny unixowej z odpowiednim adresem powoduje błądENOENT: brak takiego pliku lub katalogu.

Dwa gniazda są poprawnie zainicjowane, a pliki gniazd są tworzone i odpowiednio powiązane. Gniazda serwera i klienta działają w innym procesie, chociaż proces klienta to fork () - ed i execl () - ed. W ten sposób analizuję adres dla gniazda klienta i serwera, którego używam do konfigurowania gniazda klienta. Proces serwera używa pthreads.

Tutaj jest mójpołączyć() próba:

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

Wypróbowałem różne wartości rozmiaru, takie jak:

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

Co zaskakujące, wszystkie inicjalizacje z wyjątkiem ostatniej powodująEINVAL: niepoprawny argument błąd dlapołączyć() i dostajęENOENT: brak takiego pliku lub katalogu tylko z ostatnim. Próbowałem nawet całych przykładów z Internetu, ale bez powodzenia. I oczywiście zamiana socklen_t na size_t lubint nic nie zmienia.

Sprawdziłem już to:

adres.sun_path zawiera poprawną ścieżkę pliku gniazda, zaczynając od katalogu głównegoaddress.sun_path ma długość 61 znakówadres.sun_family jest ustawiony na AF_UNIX / AF_LOCALadres.sun_family ma rozmiar 2 bajtówbrak błędów przy tworzeniu i wiązaniu obu gniazdgniazdo serwera jest w stanie nasłuchiwaniasizeof (adres) zwraca 110, jak powinno być

Teraz zastanawiałem się, dlaczego przykład strony podręcznika nie działa i czy nastąpiły zmiany, które nie zostały zaktualizowanelinux.die.net lubwww.kernel.org. Moim systemem operacyjnym jest Debian Squeeze, jeśli jest on odpowiedni.

Jakieś pomysły, co robię źle? I jak go rozwiązać? Jeśli potrzebujesz więcej kodu lub masz pytania, nie wahaj się zapytać mnie (choć nie muszę tego określać, ale to jest mój pierwszy post tutaj. <).

btw, przepraszam za mój zły angielski

Aktualizacja 2

Rozwiązany. Opublikuję to w dodatkowej odpowiedzi poniżej z jasności.

questionAnswers(2)

yourAnswerToTheQuestion