Вы ищете getpeername()
для равноправной стороны гнезда. Используйте getsockname()
для локальной стороны сокета. Следующий фрагмент извлечет сокеты локальных и одноранговых адресов в домене Интернета. Я оставлю это на ваше усмотрение, чтобы расширить его для обработки других типов сокетов, если у вас есть необходимость. Я включил некоторую элементарную проверку ошибок в качестве бонуса.
int
get_addresses(int sd, struct sockaddr_in *local_ptr,
struct sockaddr_in *peer_ptr)
{
int rc = -1;
if (local_ptr == NULL || peer_ptr == NULL) {
errno = EFAULT;
return rc;
}
if (sd == -1) {
errno = EBADF;
return rc;
}
if (local_ptr->sin_family != AF_INET || peer_ptr->sin_family != AF_INET) {
errno = EINVAL;
return rc;
}
rc = getsockname(sd, (struct sockaddr*)local_ptr,
sizeof(struct sockaddr_in));
if (rc == 0) {
rc = getpeername(sd, (struct sockaddr*)local_ptr,
sizeof(struct sockaddr_in));
if (rc < 0) {
if (errno == ENOTCONN) {
/* socket is not connected so zero out the peer side */
peer_ptr->sin_len = sizeof(struct sockaddr_in);
peer_ptr->sin_family = AF_INET;
peer_ptr->sin_port = 0;
peer_ptr->sin_addr.s_addr = INADDR_NONE;
rc = 0;
}
}
}
return rc;
}