To powinien być nazywany tak:
bind (sd, (struct sockaddr *) &addr, length);
Jak, dlaczego, to jest droga C robi polymorphism, jeśli spojrzeć na definicjach tych struktur:
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
// IPv4 AF_INET sockets:
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
// IPv6 AF_INET6 sockets:
struct sockaddr_in6 {
u_int16_t sin6_family; // address family, AF_INET6
u_int16_t sin6_port; // port number, Network Byte Order
u_int32_t sin6_flowinfo; // IPv6 flow information
struct in6_addr sin6_addr; // IPv6 address
u_int32_t sin6_scope_id; // Scope ID
};
Wszyscy dziel się tym samym pierwszym członkiem, sa_family
po przekazaniu wskaźnika do jednej z tych struktur do bind()
po raz pierwszy oddałeś go do struct sockaddr *
, a wewnątrz funkcji sa_family
jest używany do określenia którą strukturę przekazałeś i odrzuciłeś do prawej, zamiast jednej funkcji dla każdej struktury masz jedną funkcję, która akceptuje sockaddr*
.
Innym sposobem, aby spojrzeć na to z perspektywy OOP, wyobrazić sobie, że sockaddr
jest klasą bazową dla sockaddr_in
i i przechodzącą wskaźnik do sockaddr
jest podobna do odlewania do rodzaju podłoża i wywołanie funkcji rodzajowe. mam nadzieję, że to wyjaśni.
Połączenie wywołałoby ostrzeżenie. – alk
ok, w jaki sposób unika się go 'struct sockaddr_in *'? Nigdy wcześniej nie słyszałem takich argumentów, więc nie mam pojęcia, co dokładnie robi. – pushgr8
'struct sockaddr_in *' wywołuje ostrzeżenie. Powinien to być "struct sockaddr *". – alk