Используйте getpeername
.Я подозреваю, что ваша проблема в том, что getsockname
возвращает информацию для вашей (локальной) стороны сокета, которая, вероятно, связана с 0.0.0.0 (это означает, что она может принимать соединения с любого интерфейса).
Редактировать: Мне кажется, я нашел вашу настоящую ошибку при чтении кода.Эта строка неверна:
getsockname(stdin, &addr, sizeof(addr));
Функции getsockname
и getpeername
принимают socklen_t *
(указатель ) в качестве третьего аргумента, а не size_t
.Компилятор должен сообщать вам об этой ошибке, если вы не забыли включить заголовок с прототипом для getsockname
.Также, как уже было сказано, stdin
неверно.Попробуйте:
socklen_t len = sizeof addr;
getpeername(0, &addr, &len);
или (только C99):
getpeername(0, &addr, (socklen_t[1]){sizeof addr});
Вы также должны проверять возвращаемое значение;если вы это сделаете, вы увидите, что он возвращает ошибки.