У вас есть несколько ошибок:
- Не следует создавать объект типа
struct sockaddr
.Вместо этого вы должны использовать struct sockaddr_in
или struct sockaddr_in6
в зависимости от типа сокета; - Вы должны проверить возвращаемое значение
getpeername()
на наличие ошибок. - Вы должны передатьуказатель на
struct in_addr
или struct in6_addr
на inet_ntop()
, а не указатель на sockaddr.
Он должен выглядеть следующим образом:
char buf[INET_ADDRSTRLEN] = "";
struct sockaddr_in name;
socklen_t len = sizeof(name);
if (getpeername(sock_fd, (struct sockaddr *)&name, &len) != 0) {
perror("getpeername");
} else {
inet_ntop(AF_INET, &name.sin_addr, buf, sizeof buf);
}
Вам не нужноиспользуйте getpeername()
, однако - вместо этого вы можете передать (struct sockaddr *)&name
и &len
в качестве второго и третьего параметров accept()
и продолжить оттуда.