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