Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Client never closes socket #235

Open
pavel-kamaev opened this issue Feb 5, 2022 · 2 comments
Open

Client never closes socket #235

pavel-kamaev opened this issue Feb 5, 2022 · 2 comments

Comments

@pavel-kamaev
Copy link

c->disconnect() should be called inside MQTTCloseSession()

@scaprile
Copy link
Contributor

scaprile commented Feb 5, 2022

What is 'c' ? In which module ? In which file ?
There is a MQTTCloseSession() function in MQTTClient.c in MQTTClient-C that has a parameter named 'c', which is a MQTTClient structure; there is no member named 'disconnect' in that structure. Are you using this very repo or a forked/vendor modified one?
The client does not know what a socket is, it is network agnostic, whatever you are using as a transport support has to handle the TCP connection to the broker, including opening and closing the socket (if you use a socket API) and handling network errors.
For example:

  • the Linux port has NetworkDisconnect() which closes the socket, as you can see on the sample MQTTClient-C/samples/linux/stdoutsub.c.
  • the FreeRTOS port has a 'disconnect' member in a 'Network' structure that handles that.

@pavel-kamaev
Copy link
Author

I use this repo with FreeRTOS and LwIP stack.

I do something like that:

while (1) {
  do {
    NetworkInit(&network);
    MQTTClientInit(&client, &network, 30000, sendbuf, sizeof(sendbuf), readbuf, sizeof(readbuf));
    if ((rc = NetworkConnect(&network, broker_addr, 1883)) != 0) {
      continue;
    }
// Fill connectData
    if ((rc = MQTTConnect(&client, &connectData)) != 0) {
      continue;
    }
// Subscribe
  } while (rc != SUCCESS);
  while (1) {
    if ((rc = MQTTYield(&client, 500)) != 0) {
      break;
    }
  }
}

What is the proper way to handle connection errors (reconnect to broker on error)? Should I close connection every time MQTTYield() returns negative value or FAILURE only? Is there any reason not to use disconnect callback from MQTTCloseSession()?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants