Exemplo n.º 1
0
int mosquitto_reconnect(struct mosquitto *mosq)
{
    int rc;
    struct _mosquitto_packet *packet;
    if(!mosq) return MOSQ_ERR_INVAL;
    if(!mosq->host || mosq->port <= 0) return MOSQ_ERR_INVAL;

    pthread_mutex_lock(&mosq->state_mutex);
    mosq->state = mosq_cs_new;
    pthread_mutex_unlock(&mosq->state_mutex);

    pthread_mutex_lock(&mosq->msgtime_mutex);
    mosq->last_msg_in = time(NULL);
    mosq->last_msg_out = time(NULL);
    pthread_mutex_unlock(&mosq->msgtime_mutex);

    mosq->ping_t = 0;

    _mosquitto_packet_cleanup(&mosq->in_packet);

    pthread_mutex_lock(&mosq->current_out_packet_mutex);
    pthread_mutex_lock(&mosq->out_packet_mutex);

    if(mosq->out_packet && !mosq->current_out_packet) {
        mosq->current_out_packet = mosq->out_packet;
        mosq->out_packet = mosq->out_packet->next;
    }

    while(mosq->current_out_packet) {
        packet = mosq->current_out_packet;
        /* Free data and reset values */
        mosq->current_out_packet = mosq->out_packet;
        if(mosq->out_packet) {
            mosq->out_packet = mosq->out_packet->next;
        }

        _mosquitto_packet_cleanup(packet);
        _mosquitto_free(packet);
    }
    pthread_mutex_unlock(&mosq->out_packet_mutex);
    pthread_mutex_unlock(&mosq->current_out_packet_mutex);

    _mosquitto_messages_reconnect_reset(mosq);

    rc = _mosquitto_socket_connect(mosq, mosq->host, mosq->port);
    if(rc) {
        return rc;
    }

    return _mosquitto_send_connect(mosq, mosq->keepalive, mosq->clean_session);
}
Exemplo n.º 2
0
static int _mosquitto_reconnect(struct mosquitto *mosq, bool blocking)
{
	int rc;
	struct _mosquitto_packet *packet;
	if(!mosq) return MOSQ_ERR_INVAL;
	if(!mosq->host || mosq->port <= 0) return MOSQ_ERR_INVAL;

	pthread_mutex_lock(&mosq->state_mutex);
#ifdef WITH_SOCKS
	if(mosq->socks5_host){
		mosq->state = mosq_cs_socks5_new;
	}else
#endif
	{
		mosq->state = mosq_cs_new;
	}
	pthread_mutex_unlock(&mosq->state_mutex);

	pthread_mutex_lock(&mosq->msgtime_mutex);
	mosq->last_msg_in = mosquitto_time();
	mosq->last_msg_out = mosquitto_time();
	pthread_mutex_unlock(&mosq->msgtime_mutex);

	mosq->ping_t = 0;

	_mosquitto_packet_cleanup(&mosq->in_packet);
		
	pthread_mutex_lock(&mosq->current_out_packet_mutex);
	pthread_mutex_lock(&mosq->out_packet_mutex);

	if(mosq->out_packet && !mosq->current_out_packet){
		mosq->current_out_packet = mosq->out_packet;
		mosq->out_packet = mosq->out_packet->next;
	}

	while(mosq->current_out_packet){
		packet = mosq->current_out_packet;
		/* Free data and reset values */
		mosq->current_out_packet = mosq->out_packet;
		if(mosq->out_packet){
			mosq->out_packet = mosq->out_packet->next;
		}

		_mosquitto_packet_cleanup(packet);
		_mosquitto_free(packet);
	}
	pthread_mutex_unlock(&mosq->out_packet_mutex);
	pthread_mutex_unlock(&mosq->current_out_packet_mutex);

	_mosquitto_messages_reconnect_reset(mosq);

#ifdef WITH_SOCKS
	if(mosq->socks5_host){
		rc = _mosquitto_socket_connect(mosq, mosq->socks5_host, mosq->socks5_port, mosq->bind_address, blocking);
	}else
#endif
	{
		rc = _mosquitto_socket_connect(mosq, mosq->host, mosq->port, mosq->bind_address, blocking);
	}
	if(rc>0){
		return rc;
	}

#ifdef WITH_SOCKS
	if(mosq->socks5_host){
		return mosquitto__socks5_send(mosq);
	}else
#endif
	{
		return _mosquitto_send_connect(mosq, mosq->keepalive, mosq->clean_session);
	}
}
Exemplo n.º 3
0
int mosquitto_reconnect(struct mosquitto *mosq)
{
    int rc;
    struct _mosquitto_packet *packet;
    //输入参数是否正规的判断
    if(!mosq) return MOSQ_ERR_INVAL;
    if(!mosq->host || mosq->port <= 0) return MOSQ_ERR_INVAL;

    //更新连接状态
    pthread_mutex_lock(&mosq->state_mutex);
    mosq->state = mosq_cs_new;
    pthread_mutex_unlock(&mosq->state_mutex);

    //重置最后接受和发送信息的时间
    pthread_mutex_lock(&mosq->msgtime_mutex);
    mosq->last_msg_in = time(NULL);
    mosq->last_msg_out = time(NULL);
    pthread_mutex_unlock(&mosq->msgtime_mutex);

    //PING命令等待时间置0
    mosq->ping_t = 0;

    //清理接受包的信息
    _mosquitto_packet_cleanup(&mosq->in_packet);

    pthread_mutex_lock(&mosq->current_out_packet_mutex);
    pthread_mutex_lock(&mosq->out_packet_mutex);
    //当发送包信息已经初始化   并且  当前发送包信息为空
    if(mosq->out_packet && !mosq->current_out_packet) {
        mosq->current_out_packet = mosq->out_packet;
        mosq->out_packet = mosq->out_packet->next;
    }

    //清理发送包信息
    while(mosq->current_out_packet) {
        //指向当前发送包信息
        packet = mosq->current_out_packet;
        /* Free data and reset values */
        mosq->current_out_packet = mosq->out_packet;
        if(mosq->out_packet) {
            mosq->out_packet = mosq->out_packet->next;
        }

        //清理包信息
        _mosquitto_packet_cleanup(packet);
        //释放包
        _mosquitto_free(packet);
    }
    pthread_mutex_unlock(&mosq->out_packet_mutex);
    pthread_mutex_unlock(&mosq->current_out_packet_mutex);

    //删除收到的信息内容,并删除不需要等待回应的发出的信息内容
    _mosquitto_messages_reconnect_reset(mosq);

    //创建一个socket,连接到指定的host和port
    rc = _mosquitto_socket_connect(mosq, mosq->host, mosq->port);
    if(rc) {
        return rc;
    }

    return _mosquitto_send_connect(mosq, mosq->keepalive, mosq->clean_session);
}