Получить случайный порт для сокета - PullRequest
0 голосов
/ 17 июня 2020

Я знаю, что вопрос уже задан, но я кажусь каким-то «особенным», поскольку мой код не работает. Инструкция - «связать с портом 0 и использовать getsockname для получения порта». Что я делаю не так ...

struct sockaddr_in sa;

sa.sin_port=htons(0);
sa.sin_addr.s_addr=htonl(INADDR_ANY);
sa.sin_family=AF_INET;

int sock;
sock = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr *serverptr = (struct sockaddr*)&sa;
bind(sock, serverptr,sizeof(sa));
socklen_t s=sizeof(sa);
int g=getsockname(sock,serverptr,&s);

g всегда печатает как 0.

EDIT: это было намного проще, просто sa.sin_port Тупой вопрос.

1 Ответ

1 голос
/ 17 июня 2020

Большинство функций 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;
}
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...