TCP-Server

 

Here is a simple TCP server that can be used with the TCP client shown in the chapter 19.1.12. As example, assume to have two modules, one in server mode, the second one in client mode.

 

Server side:

set the PORT in accordance with the client

start the PDP context

start the TCPServer()

take note of its IP address and use it to set the client

 

Now, the server is waiting a message from the client. When the client message is received, it sends "Hello World!" to the client.

 

 

 

void TCPServer()

{

    struct M2M_SOCKET_BSD_SOCKADDR_IN stSockAddr;

    M2M_SOCKET_BSD_SOCKET SocketFD,ConnectFD;

    INT32 Res, addrlen, MY_IP_inet_address;

    INT32 timeOutVal = 240000;

    UINT16 PORT = YYYY;                                   /* ß SET PORT USED BY THE CLIENT */

    CHAR buf_recv[100];

    CHAR buf_send[] = "Hello World!";

   

    MY_IP_inet_address = m2m_pdp_get_my_ip();

    PrintToUart("IP String: %s", m2m_socket_bsd_addr_str(MY_IP_inet_address));

 

    for(;;)

    {

 

    SocketFD = m2m_socket_bsd_socket(M2M_SOCKET_BSD_AF_INET, M2M_SOCKET_BSD_SOCK_STREAM,

                                                                  M2M_SOCKET_BSD_IPPROTO_TCP);

 

    if(M2M_SOCKET_BSD_INVALID_SOCKET == SocketFD)

    {

      PrintToUart("Socket handle FAILURE");                     /* See chapter 19.1.8 PrintToUart */ 

      return;

    }

 

    PrintToUart ("Socket handle: SUCCESS");

 

    memset(&stSockAddr, 0, sizeof(struct M2M_SOCKET_BSD_SOCKADDR_IN));

   

    stSockAddr.sin_family = M2M_SOCKET_BSD_AF_INET;

    stSockAddr.sin_port = m2m_socket_bsd_htons(PORT);

    stSockAddr.sin_addr.s_addr = M2M_SOCKET_BSD_INADDR_ANY;

 

    if(M2M_SOCKET_BSD_INVALID_SOCKET ==

        m2m_socket_bsd_bind(SocketFD,(struct M2M_SOCKET_BSD_SOCKADDR *)&stSockAddr, sizeof(struct   

                                               M2M_SOCKET_BSD_SOCKADDR_IN)))

    {

        PrintToUart("Socket bind FAILURE");

        m2m_socket_bsd_close(SocketFD);

        return;

    }

 

   PrintToUart ("Socket bind: SUCCESS");

 

    if(M2M_SOCKET_BSD_INVALID_SOCKET == m2m_socket_bsd_listen(SocketFD, 1))

    {

        PrintToUart("Socket listen FAILURE");

        m2m_socket_bsd_close(SocketFD);

        return;

    }

 

    PrintToUart ("Socket listen: SUCCESS");

 

    m2m_socket_bsd_set_sock_opt(SocketFD, M2M_SOCKET_BSD_SOL_SOCKET, M2M_SOCKET_BSD_SO_RCVTIMEO,

                                                         &timeOutVal, sizeof(timeOutVal));

 

 

 

      PrintToUart ("Accept loop");

 

     ConnectFD = m2m_socket_bsd_accept(SocketFD, (struct M2M_SOCKET_BSD_SOCKADDR *)&stSockAddr,

                                                                       &addrlen);

 

     

 

      if(0 > ConnectFD)

      {

          PrintToUart ("Socket accept: FAILURE");

          m2m_socket_bsd_close(SocketFD);

          return;

      }

 

      /* receive message from client */

 

      Res = m2m_socket_bsd_recv(ConnectFD, buf_recv, sizeof(buf_recv), 0);

 

      if(Res < 0)

      {

         PrintToUart ("Receiving: FAILURE");

      }

      else

      {

         PrintToUart ("Receiving: SUCCESS, characters received = %d", Res);

 

         PrintToUart ("%s", buf_recv);

       }

 

        /* send message to client */

 

       Res = m2m_socket_bsd_send_buf_size(ConnectFD);

 

       if (Res > sizeof(buf_send))

       {

         PrintToUart ("Available buffer space = %d",Res);

         Res = m2m_socket_bsd_send(ConnectFD, buf_send, sizeof(buf_send), 0);

       }

 

       if(Res < 0)

       {

             PrintToUart ("Sending: FAILURE");

       }

       else

       {

             PrintToUart ("Sending: SUCCESS, character sent = %d", Res);

       }

 

       m2m_socket_bsd_close(ConnectFD);

 

 

       while(1)

       {

 

Res = m2m_socket_bsd_socket_state(ConnectFD);

            if(Res == M2M_SOCKET_STATE_CLOSED )

                {

               break;

            }

            m2m_os_sleep_ms(1000)

        }

 

        if(m2m_socket_bsd_close(SocketFD) != 0)

        {

            PrintToUart("ERROR closing parent socket. errno: %d", m2m_socket_errno());

        }

 

        while(1)

        {

 

                Res = m2m_socket_bsd_socket_state(SocketFD);

                if(Res == M2M_SOCKET_STATE_CLOSED )

                {

                   break;

            }

               m2m_os_sleep_ms(1000);

        }

 

    }   /* for(;;) */

    return;

}