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 2Rozwiązany. Opublikuję to w dodatkowej odpowiedzi poniżej z jasności.