2015-09-25 4 views
-1

Я использую клиентскую библиотеку apollo broker и mosquitto C. После успешного опубликования сообщения я отключу клиента, используя функцию mosquitto_disconnect (mosq). но похоже, что порт, который клиент использовал для связи с брокером, по-прежнему не является бесплатным. Есть ли способ вручную освободить порт, который клиент использовал для связи с брокером в c-программе?Освобождение порта после того, как клиент отключается с mktt broker

void on_publish(struct mosquitto *mosq, void *userdata, int mid) 
{ 

    mosquitto_disconnect(mosq); 

    log_print("mqtt",1,"Inside publish callback"); 


} 

int sendData_mqtt(char *address, char *port, char* url, char *data) 
{ 
    struct mosquitto *mosq; 
    int err; 
    char *clean_session = "true"; 
    char *retain_flag = "true"; 
    int port1= atoi(port); 

    mosq = mosquitto_new("unknown", clean_session, NULL); 
    mosquitto_publish_callback_set(mosq, on_publish); 

    mosquitto_username_pw_set(mosq,"admin","password"); 
    err=mosquitto_connect(mosq, address,port1,60); 
    if(err != 0){ 
     log_print("mqtt",1,"connect error= %s\n",mosquitto_strerror(err)); 
     return -1; 
    } 
     else 
      log_print("mqtt",1,"successfully connected"); 
    err = mosquitto_publish(mosq, NULL, "subject", strlen(data), data, 1, retain_flag); 

    sleep(5); 
    if(err != 0) { 
     log_print("mqtt",1,"Publish error = %s\n",mosquitto_strerror(err)); 
     return -1; 
     } 
    mosquitto_loop_forever(mosq,-1,1); 

    return 10; 
} 

ответ

0

Это должно происходить автоматически после того, как libmosquitto думает, что послал РАЗЪЕДИНЕНИЕ пакет будет закрыть сокет.

Вы звонили в mosquitto_loop_forever() или mosquitto_loop_start(), чтобы обработать сетевой трафик?

Какую версию libmosquitto вы используете?

Может быть, брокер отвергает ваши верительные грамоты, если вы не осознаете? Попробуйте добавить обратный вызов журнала, чтобы узнать, что происходит.

void on_log(struct mosquitto *mosq, void *userdata, int level, const char *msg) 
{ 
    printf("%s\n", msg); 
} 

И использовать

mosquitto_log_callback_set(mosq, on_log); 

Я искушение сказать, что вам нужно, чтобы вернуться к основам, а также. Посмотрите на clean_session и сохраните аргументы для mosquitto_new и mosquitto_publish - они не должны быть строкой char *, установленной в «true». Прочтите документацию, посмотрите, какие инструменты доступны для выполнения отладки (например, on_log), затем выйдите и выполните некоторую отладку. Возможно, просмотрите источник, чтобы узнать, что вы ожидаете от него.

+0

Я использовал mosquitto_loop_forever() и libmosquitto Версия 1.4.2 – prem

+0

Не могли бы вы предоставить пример кода? – ralight

+0

Фактически это тот же код, который вы указали в моем предыдущем вопросе, но в любом случае плохо добавьте код – prem

 Смежные вопросы

  • Нет связанных вопросов^_^