Page 1 of 2

Simple TCP communication over wifi

Posted: Mon Jun 04, 2018 11:39 am
by Deouss
I just started a new project that requires simple tcp communication between esp and pc and looking for a code example particularly for RTOS esp-idf. Not sure if there are network socket libraries for the simplest tcp ip. Non blocking would be awesome.
If anyone has experience in such I'd appreciate help

Thank you for all help

Re: Simple TCP communication over wifi

Posted: Mon Jun 04, 2018 2:31 pm
by kolban
Is your ESP32 going to be a TCP/IP server accepting incoming client connection requests or will it be a client attempting to connect to an external TCP/IP server?

Re: Simple TCP communication over wifi

Posted: Mon Jun 04, 2018 5:07 pm
by Deouss
Only client. Server maybe in future but for now just tiny client sending and receiving data

Re: Simple TCP communication over wifi

Posted: Mon Jun 04, 2018 5:13 pm
by fly135
Deouss wrote:Only client. Server maybe in future but for now just tiny client sending and receiving data

Code: Select all

int create_ipv4_socket()
{
  struct addrinfo hints;
  struct addrinfo *res;
  struct in_addr *addr;

  hints.ai_family = AF_INET;
  hints.ai_socktype = SOCK_STREAM;
  
  int err = getaddrinfo(UDP_IPV4_ADDR, TCP_PORT, &hints, &res);

  if(err != 0 || res == NULL) {
    printf("DNS lookup failed err=%d res=%p\n", err, res);
    return -1;
  }

  /* Code to print the resolved IP.

     Note: inet_ntoa is non-reentrant, look at ipaddr_ntoa_r for "real" code */
  addr = &((struct sockaddr_in *)res->ai_addr)->sin_addr;
  printf("DNS lookup succeeded. IP=%s\n", inet_ntoa(*addr));

  l_sock = socket(res->ai_family, res->ai_socktype, 0);
  if(l_sock < 0) {
    printf("... Failed to allocate socket.\n");
    freeaddrinfo(res);
    return -1;
  }

  struct timeval to;
  to.tv_sec = 2;
  to.tv_usec = 0;
  setsockopt(l_sock,SOL_SOCKET,SO_SNDTIMEO,&to,sizeof(to));
  
  if(connect(l_sock, res->ai_addr, res->ai_addrlen) != 0) {
    printf("... socket connect failed errno=%d\n", errno);
    close(l_sock);
    freeaddrinfo(res);
    return -1;
  }

  printf("... connected\n");
  freeaddrinfo(res);

  // All set, socket is configured for sending and receiving
  return l_sock;
}


Re: Simple TCP communication over wifi

Posted: Mon Jun 04, 2018 6:17 pm
by kolban
As Mr fly135 wonderfully illustrates, there is nothing "special" in ESP32 TCP/IP programming. Now, of course, as soon as I said that ... the idea of "special" is subjective ... so let me explain. For many decades there has been a programming API available in C for working with TCP/IP networking. That API is called "sockets".

See:

https://en.wikipedia.org/wiki/Berkeley_sockets

... and where I am going with this is that if you find a book/article/videos on "sockets in general" then the vast majority of it will stand you well in the ESP32 world. If I were in your shoes, I'd grab a gallon of coffee, make a list of some good books and other materials on sockets ... (generically) and go read ... once you understand sockets concepts such as:

* socket
* bind
* accept
* listen
* send
* recv
* close

you will then find you can apply those identically in an ESP32 environment. You will also be able to apply the same ideas in other applications / platforms.

Re: Simple TCP communication over wifi

Posted: Mon Jun 04, 2018 9:49 pm
by Deouss
Thank you very much guys!
I can build anything out of sockets)
If you know more examples for client server communication I'd be glad to see them.
Thanks again

Re: Simple TCP communication over wifi

Posted: Thu Jul 12, 2018 2:35 pm
by Deouss
I actually have a question about TCP client.

What are the correct steps to:

1) connect to desired WiFI SSID to use TCP transfers
2) initialize client tcp socket
3) connect socket to tcp server address
4) receive data from server

Thanks

PS: that example code above gives many errors related to undefined functions.
I do't know what header files I need for network app

Re: Simple TCP communication over wifi

Posted: Thu Jul 12, 2018 8:24 pm
by kolban
Here is a sample I keep as a reference for making a client connection to an external socket server. This assumes we already have a good WiFi connection to the network:

https://github.com/nkolban/esp32-snippe ... etClient.c

Re: Simple TCP communication over wifi

Posted: Thu Jul 12, 2018 10:17 pm
by fly135
The examples directory in the ESP32 SDK is full of examples of connecting to wifi. Look in the $IDF_PATH/examples/protocols directory for examples. In those examples you will see the necessary include files.

I recommend a text editor that has a "find in files" option like notepad++. If you don't know the include file of a definition you can typically do a "find in files" on that definition in the $IDF_PATH/components directory using "*.h" as a filter.

John A

Re: Simple TCP communication over wifi

Posted: Fri Jul 13, 2018 8:44 am
by Deouss
I am getting error during connection to simple console Windows program listening on port
error 'Connection reset by peer'

Soket family is InterNetwork (on console) - esp uses AF_INET - I guess it is same?
I tested all with iperf example so maybe I need to use other socket or something.
Firewall might be issue too but it is off. What could be wrong?