当前位置:网站首页>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
边栏推荐
- Practical development tutorial of software problem repair tracking system (Part 1)
- Have you seen the management area decoupling architecture? Can help customers solve big problems
- STM32F103C8T6 + 0.96“ I2C OLED显示3D_Cube
- 关于标准IO缓冲区的问题
- 解决电脑恶意广告弹窗的思路
- Dynamic programming -- digital statistics DP
- Stm32f103c8t6 + 0.96 "I2C OLED display 3d_cube
- 远距离串口服务器( 适配器)UART 转 1-Wire 应用
- Shell编程规范与变量
- Where is the RDS MySQL read-only instance of Alibaba cloud created
猜你喜欢
随机推荐
js 链表 02
MicTR01 Tester 开发套件(振弦采集读数仪)使用说明
Open light input / relay output rs485/232 remote data acquisition IO module ibf70
Zhengda cup hacker marathon data analysis competition
LabVIEW Linx toolkit controls Arduino equipment (expansion-1)
SDL2 简明教程(四):用 SDL_IMAGE 库导入图片
js 双向链表 01
A program for judging the result of cyclic input
A tour of grp:05 - GRP server streaming service end stream
使用py,根据日志记录自动生成周报
High speed counter to rs485modbus RTU module ibf150
深部位移监测系统wk813应用边坡、大坝、堤防、铁路和建筑基坑开挖等深部位移测量
Pyqt5 rapid development and practice 5.1 tables and trees
解决电脑恶意广告弹窗的思路
2021-10-21 notes
How to measure the vibrating wire sensor by vibrating wire acquisition module?
便携式钻孔测斜仪数据采集仪测量原理与测斜探头的连接及使用方法
Remote serial port server (adapter) UART to 1-wire application
软件问题修复跟踪系统实战开发教程(上篇)
R语言使用fs包的file_delete函数删除指定文件夹下的指定文件、举一反三、dir_delete函数、link_delete函数可以用来删除文件夹和超链接









