Неправильный вызов connect () неожиданно завершается успешно - почему? - PullRequest
0 голосов
/ 28 июня 2018

Я ожидаю, что следующий код * потерпит неудачу, так как адрес сервера не был установлен с допустимым значением (проверено в отладчике - вся структура действительно инициализирована равной 0, что делает семейство адресов AF_UNSPEC).

* неполный иллюстративный фрагмент

static struct sockaddr_in g_server_addr; 

int main(void)
{
    int hdl;

    hdl = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (-1 == hdl)
    {
        printf("Client Socket creation failed.");
        return -1;
    }

    if(-1 == connect(hdl, (struct sockaddr *) &g_server_addr, sizeof(g_server_addr)))
    {
        printf("Connect() on socket failed.");
        return -1;
    }

    return 0;
}

Мне нужно connect () для сбоя при вызове с неправильным вводом.
(Этот код тестируется на компьютере с Ubuntu.)

1 Ответ

0 голосов
/ 28 июня 2018

На странице подключения:

Сокеты без установления соединения могут разрушить ассоциацию, подключившись к адресу с элементом sa_family sockaddr, установленным в AF_UNSPEC (поддерживается в Linux начиная с ядра 2.2).

Справочная страница немного устарела, она будет работать на любом сокете, который вообще может быть отключен, например, на сокетах TCP.

На практике нет ошибки при попытке растворить ассоциацию на потоковом сокете, который еще не подключен. Вот почему вы не получаете сообщение об ошибке.

Если вам нужно получить ошибку, инициализируйте семейство адресов недействительным семейством:

static struct sockaddr_in g_server_addr = { -1 };

Это приведет к ошибке -1 EAFNOSUPPORT (Address family not supported by protocol)

См. Также net/ipv4/af_inet.c недавнего ядра Linux:

int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
                      int addr_len, int flags) {
...
if (uaddr->sa_family == AF_UNSPEC) {
        err = sk->sk_prot->disconnect(sk, flags);
        sock->state = err ? SS_DISCONNECTING : SS_UNCONNECTED;
        goto out;
}
...
out:
    return err;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...