---
title: "W5500 TCP client get stuck after frequently receiving data from server"
url: "https://maker.wiznet.io/forum/14353"
markdown_url: "https://maker.wiznet.io/forum/14353/md"
type: "Forum topic"
category: "Ethernet Chips"
author: "Deepak"
created: "2021-09-29T12:06:49+09:00"
last_activity: "2021-09-30T14:28:55+09:00"
language: "en"
views: 1280
replies: 1
source: "WIZnet Makers forum (https://maker.wiznet.io/forum/)"
---

# W5500 TCP client get stuck after frequently receiving data from server

## Question

Asked by Deepak on 2021-09-29 in Ethernet Chips.

Hi,

I am working on W5500. In which, I am running TCP client example code given on wiznet website.

When I am sending data from a server with a 1000-millisecond delay. It is working fine. But when I am sending at a 200-millisecond delay then the code is stuck and in the switch case, it always comes “case SOCK_CLOSED:”.

Below is the code which I have used.

int32_t loopback_tcpc(uint8_t sn, uint8_t* buf, uint8_t* destip, uint16_t destport)
{
int32_t ret; // return value for SOCK_ERRORs
uint16_t size = 0, sentsize=0;

```
// Destination (TCP Server) IP info (will be connected)
// >> loopback_tcpc() function parameter
// >> Ex)
//	uint8_t destip[4] = 	{192, 168, 0, 214};
//	uint16_t destport = 	5000;

// Port number for TCP client (will be increased)
static uint16_t any_port = 	50000;

// Socket Status Transitions
// Check the W5500 Socket n status register (Sn_SR, The 'Sn_SR' controlled by Sn_CR command or Packet send/recv status)
switch(getSn_SR(sn))
{
case SOCK_ESTABLISHED :
	if(getSn_IR(sn) & Sn_IR_CON)	// Socket n interrupt register mask; TCP CON interrupt = connection with peer is successful
	{
```

#ifdef *LOOPBACK_DEBUG*
printf(“%d:Connected to - %d.%d.%d.%d : %d\r\n”,sn, destip[0], destip[1], destip[2], destip[3], destport);
#endif
setSn_IR(sn, Sn_IR_CON); // this interrupt should be write the bit cleared to ‘1’
}

```
	//////////////////////////////////////////////////////////////////////////////////////////////
	// Data Transaction Parts; Handle the [data receive and send] process
	//////////////////////////////////////////////////////////////////////////////////////////////
	if((size = getSn_RX_RSR(sn)) > 0) // Sn_RX_RSR: Socket n Received Size Register, Receiving data length
	{
		if(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE; // DATA_BUF_SIZE means user defined buffer size (array)
		ret = recv(sn, buf, size); // Data Receive process (H/W Rx socket buffer -> User's buffer)

		if(ret <= 0) return ret; // If the received data length <= 0, receive failed and process end
		size = (uint16_t) ret;
		sentsize = 0;
       
		// Data sentsize control
                   
		while(size != sentsize)
		{
                          // only receiving and sending to UART
			HAL_UART_Transmit(&huart3, "A", 1, 100);
			size=0;
		}
	}
	//////////////////////////////////////////////////////////////////////////////////////////////
	break;

case SOCK_CLOSE_WAIT :
```

#ifdef *LOOPBACK_DEBUG*
//printf(“%d:CloseWait\r\n”,sn);
#endif
if((ret=disconnect(sn)) != SOCK_OK) return ret;
#ifdef *LOOPBACK_DEBUG*
printf(“%d:Socket Closed\r\n”, sn);
#endif
break;

```
case SOCK_INIT :
```

#ifdef *LOOPBACK_DEBUG*
printf(“%d:Try to connect to the %d.%d.%d.%d : %d\r\n”, sn, destip[0], destip[1], destip[2], destip[3], destport);
#endif
if( (ret = connect(sn, destip, destport)) != SOCK_OK) return ret; // Try to TCP connect to the TCP server (destination)
break;

```
case SOCK_CLOSED:
	close(sn);
	if((ret=socket(sn, Sn_MR_TCP, any_port++, 0x00)) != sn){
		if(any_port == 0xffff) any_port = 50000;
		return ret; // TCP socket open with 'any_port' port number
	}
```

#ifdef *LOOPBACK_DEBUG*
//printf(“%d:TCP client loopback start\r\n”,sn);
//printf(“%d:Socket opened\r\n”,sn);
#endif
break;
default:
break;
}
return 1;
}

## Replies

### Reply 1 by Mxyxixptlick, 2021-09-30

I forked this W5500 library from an existing one for Arduino and made substantial improvements to it. I’ve had it running on the internet for over 2 years as both a client and a server. You may want to give it a try. Examples are included. [GitHub - SapientHetero/Ethernet: Ethernet Library for Arduino](https://github.com/SapientHetero/Ethernet)

---

Source: https://maker.wiznet.io/forum/14353
