---
title: "iolibrary 수신부 circular queue buffer 코드 구현"
url: "https://maker.wiznet.io/forum/15673"
markdown_url: "https://maker.wiznet.io/forum/15673/md"
type: "Forum topic"
category: "Ethernet Chips"
author: "puredj"
created: "2025-04-04T17:04:50+09:00"
last_activity: "2025-04-04T17:04:50+09:00"
language: "en"
views: 6
replies: 0
source: "WIZnet Makers forum (https://maker.wiznet.io/forum/)"
---

# iolibrary 수신부 circular queue buffer 코드 구현

## Question

Asked by puredj on 2025-04-04 in Ethernet Chips.

int32_t **loopback_tcps**(uint8_t sn, uint8_t* buf, uint16_t port)

{

int32_t ret;

uint16_t size = 0;

**#ifdef** _LOOPBACK_DEBUG_

uint8_t destip[4];

uint16_t destport;

**#endifswitch**(getSn_SR(sn))

{

**case** SOCK_ESTABLISHED :

**if**(getSn_IR(sn) & Sn_IR_CON)

{

**#ifdef** _LOOPBACK_DEBUG_

getSn_DIPR(sn, destip);

destport = getSn_DPORT(sn);

printf("%d:Connected - %d.%d.%d.%d : %d\r\n",sn, destip[0], destip[1], destip[2], destip[3], destport);

**#endif**

setSn_IR(sn,Sn_IR_CON);

}

lan_connected = true;

**if**((size = getSn_RX_RSR(sn)) > 0) // Don't need to check SOCKERR_BUSY because it doesn't not occur.

{

**if**(size > DATA_BUF_SIZE) size = DATA_BUF_SIZE;

ret = recv(sn, buf, size);

**if**(ret &lt;= 0) **return** ret; // check SOCKERR_BUSY & SOCKERR_XXX. For showing the occurrence of SOCKERR_BUSY.

size = (uint16_t) ret;

}

**break**;

**case** SOCK_CLOSE_WAIT :

**#ifdef** _LOOPBACK_DEBUG_

//printf("%d:CloseWait\r\n",sn);

**#endif**

lan_connected = false;

close_process();

**if**((ret = disconnect(sn)) != SOCK_OK) **return** ret;

**#ifdef** _LOOPBACK_DEBUG_

printf("%d:Socket Closed\r\n", sn);

**#endifbreak**;

**case** SOCK_INIT :

**#ifdef** _LOOPBACK_DEBUG_

printf("%d:Listen, TCP server loopback, port [%d]\r\n", sn, port);

**#endif**

lan_connected = false;

close_process();

**if**( (ret = listen(sn)) != SOCK_OK) **return** ret;

**break**;

**case** SOCK_CLOSED:

**#ifdef** _LOOPBACK_DEBUG_

//printf("%d:TCP server loopback start\r\n",sn);

**#endif**

lan_connected = false;

close_process();

**if**((ret = socket(sn, Sn_MR_TCP, port, 0x00)) != sn) **return** ret;

**#ifdef** _LOOPBACK_DEBUG_

//printf("%d:Socket opened\r\n",sn);

**#endifbreak**;

**default**:

**break**;

}

**return** 1;

}

이 코드는 수신이 되면 수신사이즈 만큼 버퍼에 넣어 전달합니다.

이렇게 말고,

int32_t **loopback_tcps**(uint8_t sn, uint8_t*circular_queue_buf, uint16_t port)

circular queue 버퍼를 인자로 받아서 나뉘어서 들어오는 데이터를 붙여서 처리할 수 있도록 하는 방식이 궁금합니다.

---

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