Почему сокет send () возвращает успешный код в случае разрыва кабельного соединения? - PullRequest
0 голосов
/ 02 марта 2020

Я отправлял пакеты через TCP-сокет постоянно. Затем я отключил сетевой кабель и обнаружил, что send () все еще возвращает успех. Почему? Коды инициации:

// This function must be called before any other functions called.
/*  Return:
        0: success
        1: init socket fail
        2: send fail
        3: connect fail
*/

int mtMqttInit (const char *id, const char *username, const char *password, const char *hostName, const int tcpPort, unsigned int timeoutSec)
{
    int pktLen;

    mqtt_init(&mtBroker, id);
    mqtt_init_auth(&mtBroker, username, password);

    if (init_socket(&mtBroker, hostName, tcpPort)) {
        if (debug)
            printf ("init_socket()\n");
        return MT_MQTT_INIT_SOCKET_FAIL;
    }

    if (mqtt_connect(&mtBroker) == -1) {
        if (debug)
            printf ("mqtt_connect()\n");
        return MT_MQTT_INIT_CONNECT_FAIL;
    }
    .....
}

void mqtt_init(mqtt_broker_handle_t* broker, const char* clientid) {
    // Connection options
    broker->alive = 300; // 300 seconds = 5 minutes
    broker->seq = 1; // Sequency for message indetifiers
    // Client options
    // .....
    // Will topic
    broker->clean_session = 1;
}

Фрагмент кода отправки:

// Send the packet
log_status("to send");
if(broker->send(broker->socket_info, packet, sizeof(packet)) < 
    sizeof(packet)) {
    log_error("send() failed");
    return -1;
}
log_status("send() done");

Даже в случае разрыва кабельного соединения я не вижу показанное сообщение «send () faied» , То есть я не могу определить, действителен ли сокет или нет. Что с ним не так?

1 Ответ

0 голосов
/ 06 марта 2020

Я использовал getsockopt () для проверки правильности сокета, вместо проверки возвращаемого значения из send (). Оно работает. Узнав, что сокет недействителен, я закрыл его и заново создал.

Коды от Simone на Как найти состояние подключения сокета в C?

int error = 0;
socklen_t len = sizeof (error);
int retval = getsockopt (socket_fd, SOL_SOCKET, SO_ERROR, &error, &len);

/// ....
if (retval != 0) {
    /* there was a problem getting the error code */
    fprintf(stderr, "error getting socket error code: %s\n", strerror(retval));
    return;
}

if (error != 0) {
    /* socket has a non zero error status */
    fprintf(stderr, "socket error: %s\n", strerror(error));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...