sockaddr_in and sockaddr_in6 are both structures where first member is a sockaddr structure.
According to the C standard, the address of a structure and its first member are the same, so you can cast the pointer to sockaddr_in(6) in a pointer to sockaddr.
Functions taking sockaddr_in(6) as parameter may modify the sockaddr part, and functions taking sockaddr as parameter just care about that part.
It’s a bit like inheritance.