2012-03-22 4 views
6

w "sys/socket.h" definiuje funkcję:Długość rozmiar adres funkcyjny w <sys/socket.h>

int accept (int socket, struct sockaddr *address, socklen_t *address_len); 

Moje pytanie ma zrobić z socklen_t * address_len który na podstawie manual wskazuje na socklen_t, który na wejściu określa długość dostarczonej konstrukcji sockaddr, a na wyjściu określa długość przechowywanego adresu.

Pod jakimi warunkami rozmiar wejściowy będzie inny niż wyjściowy?

Potrzebuję tego, aby emulować test na opakowaniu, które utworzyłem dla struktury sockaddr_in.

Wielkie dzięki!

+0

+1 miłe pytanie –

+0

'sockaddr' ma tablicę' char' jako jej drugi element. Zwrócona wartość w 'address_len' będzie dotyczyła liczby elementów faktycznie użytych w tym elemencie (w przeciwieństwie do tego, ile może zawierać) – Attila

Odpowiedz

4

Nigdy nie może być więcej (długość wejściowa jest granicą, aby zapobiec przepełnieniu), ale może być mniejsza w przypadku niektórych typów gniazd, na przykład gniazd domeny unix, których adresy są w istocie nazwami ścieżek. W przypadku gniazd IP (v4 lub v6) zawsze będzie to nominalny rozmiar odpowiedniej struktury sockaddr_in lub .

Należy również pamiętać, że można korzystać z niektórych interfejsów, takich jak ten , nie wiedząc, jaki typ rodziny adresów/protokołów jest zaangażowany. Na przykład możesz mieć funkcję będącą częścią kodu biblioteki, która pobiera gniazdo nieznanego typu, a połączenia przyjmują ją ze strukturą sockaddr_storage. Może znaleźć adres IPv4, adres IPv6 lub coś zupełnie innego, w zależności od tego, co zrobił dzwoniący.

To użycie jest dość nietypowe dla accept, ale jest o wiele bardziej prawdopodobne, że dla getpeername używa tego samego stylu interfejsu. W rzeczywistości jest to sposób, w jaki wszystkie demony, które działają od inetd i które chcą wiedzieć, że adres zdalny musi działać.

+0

Dziękuję bardzo! –

Powiązane problemy