Hi Every one:
When I apply my below program which is a TCP server sending UDP IP address to two UDP clients threads
#include "mbed.h"
#include "EthernetInterface.h"
#include <string>
//#include "TCPServer.h" // not needed anymore
//#include "TCPSocket.h" // not needed anymore
char mbedIP[15];
char mbedMASK [15];
char mbedGATEWAY [15];
char* pFields[5];
Thread UDP_Socket_AITV01(osPriorityNormal, 2000);
Thread UDP_Socket_AITV02(osPriorityNormal, 2000);
Thread TCP_Server(osPriorityNormal, 2000);
Mutex Network_AITV01_Mutex;
Mutex Network_AITV02_Mutex;
Mutex RceiverIP_1_Mutex;
Mutex RceiverIP_2_Mutex;
// LEDs
DigitalOut led_1(D8);
DigitalOut led_2(D9);
DigitalOut led_3(D10);
DigitalOut led_4(D11);
EthernetInterface eth;
//static const char* recvIP_1;
static const char* recvIP_1 ;
static const char* recvIP_2 ;
void ParseFields(char* inputBuffer, char** pFields, uint32_t numFields, char* delimiterChars)
{
char* pString = inputBuffer;
char* pField;
for(uint32_t i=0; i<numFields; i++)
{
pField = strtok(pString, delimiterChars);
if(pField != NULL)
{
pFields[i] = pField;
}
else
{
pFields[i] = "";
}
pString = NULL; //to make strtok continue parsing the next field rather than start again on the original string (see strtok documentation for more details)
}
/* for(uint32_t i=0; i<numFields; i++)
{
printf("splitted Msg: %s\n\r", pFields[i]); //this was missing in original example.
}*/
}
void UDP_Client_AITV01_Thread()
{
printf("UDP_Thread_AITV01\n\r");
led_3=!led_3;
//char Local_IP[15];
static const char* Local_recvIP_1;
char *sbuffer_AITV01 = new char[256];
for(int i=0;i<256;i++)
{
sbuffer_AITV01[i]=NULL;
//rxbuffer[i]=NULL;
}
RceiverIP_1_Mutex.lock();
//sprintf(Local_IP,"%s\n\r",recvIP_1);
Local_recvIP_1 = recvIP_1;
RceiverIP_1_Mutex.unlock();
//printf("IP1 is: %s\n\r", Local_recvIP_1);
//SocketAddress td_addr_AITV01(Local_recvIP_1, 10110);
Network_AITV01_Mutex.lock();
UDPSocket td_sock_AITV01(ð);
Network_AITV01_Mutex.unlock();
// Loop to send data to Socket address "td_sock"
while(true)
{
RceiverIP_1_Mutex.lock();
Local_recvIP_1 = recvIP_1;
RceiverIP_1_Mutex.unlock();
//printf("IP1 is: %s\n\r", Local_recvIP_1);
SocketAddress td_addr_AITV01(Local_recvIP_1, 10110);
sprintf(sbuffer_AITV01,"%s\n\r", "hello World");
int ret_01 = td_sock_AITV01.sendto(td_addr_AITV01, sbuffer_AITV01, strlen(sbuffer_AITV01));
ThisThread::sleep_for(1000);
}
}
void UDP_Client_AITV02_Thread()
{
printf("UDP_Thread_AITV02\n\r");
led_3=!led_3;
static const char* Local_recvIP_2;
char *sbuffer_AITV02 = new char[256];
for(int i=0;i<256;i++)
{
sbuffer_AITV02[i]=NULL;
//rxbuffer[i]=NULL;
}
RceiverIP_2_Mutex.lock();
Local_recvIP_2 = recvIP_2;
RceiverIP_2_Mutex.unlock();
Network_AITV02_Mutex.lock();
UDPSocket td_sock_AITV02(ð);
Network_AITV02_Mutex.unlock();
// Loop to send data to Socket address "td_sock"
while(true)
{
RceiverIP_2_Mutex.lock();
Local_recvIP_2 = recvIP_2;
RceiverIP_2_Mutex.unlock();
//printf("IP2 is: %s\n\r", Local_recvIP_2);
SocketAddress td_addr_AITV02(Local_recvIP_2, 10110);
sprintf(sbuffer_AITV02,"%s\n\r", "hello Nada");
int ret_02 = td_sock_AITV02.sendto(td_addr_AITV02, sbuffer_AITV02, strlen(sbuffer_AITV02));
ThisThread::sleep_for(1000);
}
}
//TCP Server Thread
void TCP_Server_Thread()
{
printf("TCP server\r\n");
//TCPServer srv; //TCPServer was migrate to TCPSocket
TCPSocket srv;
TCPSocket *client_sock; // srv.accept() will return pointer to socket
SocketAddress client_addr;
char *txbuffer = new char[256];
char *rxbuffer = new char[256];
for(int i=0;i<256;i++){
txbuffer[i]=NULL;
rxbuffer[i]=NULL;
}
//static const char* PB_IP_1;
static const char* PB_IP_1;
static const char* PB_IP_2;
/* Open the server on ethernet stack */
srv.open(ð);
/* Bind the HTTP port (TCP 80) to the server */
srv.bind(eth.get_ip_address(), 4466);
/* Can handle x simultaneous connections */
srv.listen(5);
while(true)
{
client_sock = srv.accept(); //return pointer of a client socket
client_sock->getpeername(&client_addr); //this will fill address of client to the SocketAddress object
//printf("Accepted %s:%d\n\r", client_addr.get_ip_address(), client_addr.get_port());
strcpy(txbuffer, "Hello \n\r");
client_sock->send(txbuffer, strlen(txbuffer));
client_sock->recv(rxbuffer, 256);
// printf("Received Msg: %s\n\r", rxbuffer); //this was missing in original example.
ParseFields(rxbuffer, pFields, 5, ",");
//for(uint32_t i=0; i<5; i++)
// {
// printf("splitted Msg: %s\n\r", pFields[i]); //this was missing in original example.
// }
if (strcmp(pFields[4], "<EOF>") == 0)
{
if (strcmp(pFields[0], "Pinning-001") == 0)
{
if (strcmp(pFields[1], "start") == 0)
{
if (strcmp(pFields[2], "1") == 0)
{
PB_IP_1 = pFields[3];
RceiverIP_1_Mutex.lock();
//sprintf(recvIP_1,"%s",PB_IP_1);
recvIP_1 = PB_IP_1;
//printf("IP TCP:%s\n\r",recvIP_1);
RceiverIP_1_Mutex.unlock();
}
else if (strcmp(pFields[2], "2") == 0)
{
PB_IP_2 = pFields[3];
RceiverIP_2_Mutex.lock();
//sprintf(recvIP_1,"%s",PB_IP_1);
recvIP_2 = PB_IP_2;
//printf("IP TCP:%s\n\r",recvIP_1);
RceiverIP_2_Mutex.unlock();
}
}
}
}
//delete[] rxbuffer;
client_sock->close();
ThisThread::sleep_for(1000);
}
}
int main()
{
printf("TCP server example\n\r");
printf("Ethernet socket example\n\r");
sprintf(mbedIP,"192.168.220.45");
sprintf(mbedMASK,"255.255.252.0");
sprintf(mbedGATEWAY,"192.168.220.1");
nsapi_error_t set_network=eth.set_network(mbedIP,mbedMASK,mbedGATEWAY);
eth.connect();
TCP_Server.start(TCP_Server_Thread);
UDP_Socket_AITV01.start(UDP_Client_AITV01_Thread);
UDP_Socket_AITV02.start(UDP_Client_AITV02_Thread);
while(true)
{
led_1=!led_1;
ThisThread::sleep_for(1000);
}
//delete[] txbuffer;
// delete[] rxbuffer;
}
I’m getting this error
Please your advise
Nada