当前位置:网站首页>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
边栏推荐
- 使用py,根据日志记录自动生成周报
- CoDeSys realizes bubble sorting
- js 链表 02
- Where is the RDS MySQL read-only instance of Alibaba cloud created
- 头条文章_signature
- 12V pulse speed measurement to 24V level signal conversion transmitter
- The deep displacement monitoring system wk813 is used to measure the deep displacement of slopes, dams, embankments, railways and building foundation pit excavation
- Let's learn the game of beating hamsters
- 2021 Kent interview question 1
- 不懂就问,快速成为容器服务进阶玩家!
猜你喜欢

疫情红利消失,「居家健身」泡沫消散

【微信小程序开发(七)】订阅消息

Practical development tutorial of software problem repair tracking system (Part 1)

Event express | Apache Doris Performance Optimization Practice Series live broadcast course is open at the beginning. You are cordially invited to participate!

Rust Getting Started Guide (crite Management)

食品安全 | 这两类瓜果宜改善便秘 孕妇人群尤其建议

A tour of grp:05 - GRP server streaming service end stream

12V pulse speed measurement to 24V level signal conversion transmitter

Temperature measurement and imaging accuracy of ifd-x micro infrared imager (module)

mysql查询 limit 1000,10 和limit 10 速度一样快吗?如果我要分页,我该怎么办?
随机推荐
mysql查询 limit 1000,10 和limit 10 速度一样快吗?如果我要分页,我该怎么办?
Fifth uncle's thinking
KubeEdge发布云原生边缘计算威胁模型及安全防护技术白皮书
js 队列
I came across Digital Phoenix coordinate Xuhui Meiluo city in Shanghai
A failed cracking experience
五舅的思考
Note: the value is rounded up to ten, hundred, thousand, ten thousand
仅需三步 轻松实现远程办公
资本「断供」两年,我只能把公司卖了
射频模块无线收发RF63U芯片应用数据传输和基建网络
Installation points and precautions of split angle probe
Vm501 development kit development version single vibrating wire sensor acquisition module geotechnical engineering monitoring
JS linked list 01
High precision absolute angle sensor application high speed angle monitoring
A good start
IFD-x 微型红外成像仪(模块)的温度测量和成像精度
Implementation of skip table
R语言使用GGally包的ggpairs函数可视化分组多变量的两两关系图、设置alpha参数改变图像透明度、对角线上连续变量密度图、离散变量条形图、两两关系图中包含散点图、直方图、箱图以及相关性数值
Shell编程规范与变量