-1

私は apollo ブローカーと mosquitto C クライアント ライブラリを使用しています。メッセージの発行に成功したら、mosquitto_disconnect(mosq) 関数を使用してクライアントを切断します。クライアントがブローカーとの接続に使用したポートがまだ空いていないようです。クライアントが ac プログラムでブローカーとの接続に使用したポートを手動で解放する方法はありますか?

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;  
}
4

1 に答える 1

0

libmosquitto が DISCONNECT パケットを送信したと判断すると、ソケットが閉じられます。

ネットワークトラフィックを処理するために 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 など) を確認してから、そこから出てデバッグを行ってください。ソースを調べて、何が起こるかを確認してください。

于 2015-09-25T09:57:44.427 に答える