Большинство функций Berkley Socket API используют очень простое соглашение: возвращаемый результат является индикатором успеха операции. Итак, ноль означает ОК, отрицательный - ошибку. Чтобы не рисковать, вы всегда должны проверять его, и в вашем коде отсутствует эта проверка для вызовов socket()
, bind()
и getsockname()
:
...
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
// log the error, etc
return;
}
int res = bind(sock, serverptr, sizeof(sa));
if (res < 0) {
// log the error, etc
close(sock);
return;
}
socklen_t s = sizeof(sa);
res = getsockname(sock, serverptr, &s);
if (res < 0) {
// log the error, etc
close(sock);
return;
}
...