Hello All,
I have been trying to send data over ethernet to tcp server from my device/gateway. After one time connection with server and my device, I am sending data without close connection. I got the socket information in tcp_echoclient_connected like es2 and tpcbSa. After I got the socket info, I use this info in the tcp_echoserver_send3 function. thus I am able to send all data every 5second. But After 2/3 hours wr_err returns ERR_MEM. and then stop sending data. I want to send data over ethernet without stopping every 5 second. I thought after returned ERR_MEM, I send request with tcp_write function. but it didnt work out.
So,
-why wr_err returns ERR_MEM after 2/3 hours? how to I avoid this?
or
-after return ERR_MEM, what should I do to return ERR_OK or continue to send data?
Do you have any idea or advice to solve this problem?
thank you
BR
Bekir
//
// Connect to host address
//
if(ETH_Ctrl.eth_data_repeat == ETH_REPEAT_2 )
{
tcp_echoclient_connect(Gateway.Host_Address,Gateway.Remote_Port_Number);
}
else if(ETH_Ctrl.eth_data_repeat == ETH_REPEAT_1)
{
memcpy(data,Gateway.tcp_message,Gateway.tcp_message_length);
tcp_echoserver_send3(tpcbSa, (unsigned char*)data, sizeof(data), es2);
}
void tcp_echoclient_connect(char* IP_ARR,char* PORT_NUM)
{
{
/* create new tcp pcb */
echoclient_pcb = tcp_new();
if (echoclient_pcb != NULL)
{
ETH_Ctrl.eth_data_repeat = ETH_REPEAT_1;
ipaddr_aton((const char *)IP_ARR,&DestIPaddr);
DestPORTAddr = atoi(PORT_NUM);
/* connect to destination address/port */
tcp_connect(echoclient_pcb,&DestIPaddr,DestPORTAddr,tcp_echoclient_connected);
}
}
}
/**
* @brief Function called when TCP connection established
* @param tpcb: pointer on the connection contol block
* @param err: when connection correctly established err should be ERR_OK
* @retval err_t: returned error
*/
static err_t tcp_echoclient_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
{
struct echoclient *es = NULL;
if (err == ERR_OK)
{
/* allocate structure es to maintain tcp connection informations */
es = (struct echoclient *)mem_malloc(sizeof(struct echoclient));
if (es != NULL)
{
es->state = ES_CONNECTED;
es->pcb = tpcb;
tpcbSa = tpcb;
if(ETH_Ctrl.connectTYPE == ETHERNET_POST)
{
memcpy(data,Gateway.tcp_message,Gateway.tcp_message_length); //1024 tcp message datanın ilk 792 adet datası databuffer içine kaydedilir
/* allocate pbuf */
es->p_tx = pbuf_alloc(PBUF_TRANSPORT, sizeof(data) , PBUF_POOL); //burası gönderilen buffer ile aynı ozellikte bos bir buffer yaratıyor
es2=es;
return ERR_OK;
}
}
else
{
{
/* close connection */
tcp_echoclient_connection_close(tpcb, es);
/* return memory allocation error */
return ERR_MEM;
}
}
}
else
{
/* close connection */
tcp_echoclient_connection_close(tpcb, es);
}
return err;
}
void tcp_echoserver_send3(struct tcp_pcb *tpcb, unsigned char *Source, unsigned int Size, struct echoclient * es)
{
err_t wr_err = ERR_OK;
/* enqueue data for transmission */
wr_err = tcp_write(tpcb, Source, Size, 1); //TCP_WRITE_FLAG_COPY
if(wr_err == ERR_OK)
{
if(es->p_tx != NULL)
{
/* increment reference count for es->p */
pbuf_ref(es->p_tx);
}
}
else
{
if(wr_err == ERR_MEM)
{
tcp_write(tpcb, Source, Size, 1);
if (sizeof(data) > tcp_sndbuf(tpcb))
{
usb_printf("Not enough memory. Could not send data buffer\n", 50);
}
}
else
{
}
}
}