Skip to main content
Associate III
May 2, 2024
Solved

Why does lwip struct netconn state remain NETCONN_NONE even when connected?

  • May 2, 2024
  • 1 reply
  • 1864 views

Hi,

I built a telnet server using lwip on FreeRTOS. I based my code on the LwIP_HTTP_Server_Netconn_RTOS example.
Now, I want to use the connection to relay/send data to the client from different places in my program but for this, I need to know the state of the connection (if  aclient is connected or not). I've tried the following but turns out, conn-> state always stays NETCONN_NONE even when a client is connected, i.e. that's not the way to do it:

void relay_str_to_socket(char *pch, int sz)
{
    struct netconn *conn = {0};
    conn = curr_con_get();
    if (conn->state != NETCONN_NONE) {
      if (netconn_err(conn) == ERR_OK) {
        netconn_write(conn, pch, sz, NETCONN_NOCOPY);
      }
    }
}


void telnet_server_serve(struct netconn *conn) {
    struct netbuf *inbuf;
    err_t recv_err;
    char* buf;
    u16_t buflen;
    char *resp_ok = "OK, data parsed successfully!\n";
    char *resp_err = "ERR, data could not be parsed\n is first char '{'?\n";


    // Keep the connection open to continuously handle data
    while (1) {
        // Read the data from the port, blocking if nothing yet there
        recv_err = netconn_recv(conn, &inbuf);


        if (recv_err == ERR_OK) {
            if (netconn_err(conn) == ERR_OK) {
            curr_con_set(conn);
                netbuf_data(inbuf, (void**)&buf, &buflen);
                if (buflen > 0 && buf[0] == '{') {
                    // Extract data from JSON string
                    int rv = ethdataDecode(&m_dat, buf);
                    need_conf_set(1);  // Set signal that new command needs processing
                    if (rv == OK) {
                    relay_str_to_socket(resp_ok, strlen(resp_ok));
                    }
                } else {
                relay_str_to_socket(resp_err, strlen(resp_err));
                }
            }
            netbuf_delete(inbuf);  // Clean up the buffer
        } else if (recv_err == ERR_CLSD || recv_err == ERR_CONN) {
            // Close the connection if the client disconnected
            break;
        }
    }

 If I send data to the socketr if it's not connected, it appears to get stuck and never returns...

    This topic has been closed for replies.
    Best answer by debug

    Turns out I was abvle to resolve this by setting a manual "connected" flag that isset after netconn_accept() and reset after netconn_delete() in my server_netconn_thread().

    1 reply

    debugAuthorBest answer
    Associate III
    May 2, 2024

    Turns out I was abvle to resolve this by setting a manual "connected" flag that isset after netconn_accept() and reset after netconn_delete() in my server_netconn_thread().