当前位置:网站首页>LwIP development | realize TCP server through socket
LwIP development | realize TCP server through socket
2022-07-28 16:21:00 【Chop Hua】
LWIP To improve compatibility, you can also use Scoket Realization , It is mainly the code function in the file #include <lwip/sockets.h> in , The following are the main relevant codes
/** @ingroup socket */
#define accept(s,addr,addrlen) lwip_accept(s,addr,addrlen)
/** @ingroup socket */
#define bind(s,name,namelen) lwip_bind(s,name,namelen)
/** @ingroup socket */
#define shutdown(s,how) lwip_shutdown(s,how)
/** @ingroup socket */
#define getpeername(s,name,namelen) lwip_getpeername(s,name,namelen)
/** @ingroup socket */
#define getsockname(s,name,namelen) lwip_getsockname(s,name,namelen)
/** @ingroup socket */
#define setsockopt(s,level,optname,opval,optlen) lwip_setsockopt(s,level,optname,opval,optlen)
/** @ingroup socket */
#define getsockopt(s,level,optname,opval,optlen) lwip_getsockopt(s,level,optname,opval,optlen)
/** @ingroup socket */
#define closesocket(s) lwip_close(s)
/** @ingroup socket */
#define connect(s,name,namelen) lwip_connect(s,name,namelen)
/** @ingroup socket */
#define listen(s,backlog) lwip_listen(s,backlog)
/** @ingroup socket */
#define recv(s,mem,len,flags) lwip_recv(s,mem,len,flags)
/** @ingroup socket */
#define recvfrom(s,mem,len,flags,from,fromlen) lwip_recvfrom(s,mem,len,flags,from,fromlen)
/** @ingroup socket */
#define send(s,dataptr,size,flags) lwip_send(s,dataptr,size,flags)
/** @ingroup socket */
#define sendmsg(s,message,flags) lwip_sendmsg(s,message,flags)
/** @ingroup socket */
#define sendto(s,dataptr,size,flags,to,tolen) lwip_sendto(s,dataptr,size,flags,to,tolen)
/** @ingroup socket */
#define socket(domain,type,protocol) lwip_socket(domain,type,protocol)
/** @ingroup socket */
#define select(maxfdp1,readset,writeset,exceptset,timeout) lwip_select(maxfdp1,readset,writeset,exceptset,timeout)
/** @ingroup socket */
#define ioctlsocket(s,cmd,argp) lwip_ioctl(s,cmd,argp)
TCP Programming
Implement environment
1. transplant Freertos
2. transplant LWIP, Turn on LWIP_SOCKET
#include "tcp_server_test.h"
#include "lwip/opt.h"
#include <lwip/sockets.h>
#include "lwip/sys.h"
#include "lwip/api.h"
#include "string.h"
#if LWIP_SOCKET // Need to open Scoket Can be used
#define RECV_DATA (1024UL)
#define LOCAL_PORT (6133UL)
#define BACKLOG (5UL)/* Maximum number of monitors */
#define LWIP_TCP_DEBUG_ENABLE 1
#if LWIP_TCP_DEBUG_ENABLE
#define LWIP_TCP_DEBUG printf
#else
#define LWIP_TCP_DEBUG(...)
#endif
static void tcp_server_thread(void *arg)
{
int sockfd = -1,connected; /*socket Handle and the handle after the connection is established */
struct sockaddr_in server_addr,client_addr;
socklen_t sin_size;
int recv_data_len;
uint8_t recv_data[RECV_DATA];
LWIP_TCP_DEBUG("tcp server port %d\n\n",LOCAL_PORT);
again:
// establish scoket The descriptor AF_INET Use ipv4 Address
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
LWIP_TCP_DEBUG("Socket error\n");
close(sockfd);
vTaskDelay(100);
goto again;
}
//
server_addr.sin_family = AF_INET; // This property indicates the reception of native or other machine transmissions
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // This machine IP
server_addr.sin_port = htons(LOCAL_PORT); // Port number
memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
{
LWIP_TCP_DEBUG("Unable to bind\n");
close(sockfd);
vTaskDelay(100);
goto again;
}
// Set the maximum number of listeners
if (listen(sockfd, BACKLOG) == -1)
{
LWIP_TCP_DEBUG("Listen error\n");
close(sockfd);
vTaskDelay(100);
goto again;
}
while(1)
{
sin_size = sizeof(struct sockaddr_in);
// Block here until a message is received , The parameters are socket Handle , Received address information and size
connected = accept(sockfd, (struct sockaddr *)&client_addr, &sin_size);
LWIP_TCP_DEBUG("new client connected from (%s, %d)\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
int tcp_nodelay = 1;//don't delay send to coalesce packets
setsockopt(connected,IPPROTO_TCP,TCP_NODELAY,(void *) &tcp_nodelay,sizeof(int));
while(1)
{
recv_data_len = recv(connected, recv_data, RECV_DATA, 0);
if (recv_data_len <= 0)
{
break;
}
LWIP_TCP_DEBUG("recv %d len data\n",recv_data_len);
// send content
write(connected,recv_data,recv_data_len);
}
if (connected >= 0)
{
close(connected);
}
connected = -1;
}
if (sockfd >= 0)
{
close(sockfd);
}
}
#endif
void tcp_server_init(void)
{
#if LWIP_SOCKET
sys_thread_new("tcpecho_thread", tcp_server_thread, NULL, 512, 4);
#endif
}
Verified as follows 
Recommend a good blogger :https://blog.csdn.net/Chuangke_Andy/article/details/121420376
边栏推荐
- Application of optical rain gauge to rainfall detection
- js 队列
- 2-channel Di high-speed pulse counter, 1-channel encoder to Modbus TCP wired wireless module ibf161
- Numpy ndarray learning < I > Foundation
- 2021 亚鸿笔试题2
- Open light input / relay output rs485/232 remote data acquisition IO module ibf70
- 振弦采集模块测量振弦传感器的流程步骤?
- 分体式测斜探头安装要点及注意事项
- JS linked list 02
- Note: the value is rounded up to ten, hundred, thousand, ten thousand
猜你喜欢

js 链表 01

JS linked list 01

2021 Kent interview question 3

解决电脑恶意广告弹窗的思路

Ask if you don't understand, and quickly become an advanced player of container service!

Remote serial port server (adapter) UART to 1-wire application

小程序中的分页查询

JS queue

Installation points and precautions of split angle probe

魏建军骑宝马也追不上李书福
随机推荐
Event express | Apache Doris Performance Optimization Practice Series live broadcast course is open at the beginning. You are cordially invited to participate!
食品安全 | 这两类瓜果宜改善便秘 孕妇人群尤其建议
带你来浅聊一下!单商户功能模块汇总
[Multisim Simulation] LM339 zero crossing circuit simulation
使用py,根据日志记录自动生成周报
flashfxp 530 User cannot log in. ftp
2021 肯特面试题1
Voltage to current / current to voltage module
High precision absolute angle sensor application high speed angle monitoring
Note: numerical accumulation animation
Set static IP in NAT mode of virtual machine
QT QString详解
Remote serial port server (adapter) UART to 1-wire application
仅需三步 轻松实现远程办公
Detectron2 installation and testing
Dynamic programming -- digital statistics DP
Shell编程规范与变量
2021 Kent interview question 2
IFD-x 微型红外成像仪(模块)的温度测量和成像精度
JS linked list 01