你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F7 LWIP socket 创建TCP server

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:35
STM32F7 LWIP socket 创建TCP server
  1. **阻塞方式:**
复制代码
  1. typedef struct {
  2.     struct sockaddr_in client_info;
  3.     s32 id;
  4.     u16 port;
  5. } client_info_s;

  6. void client_proc(void* parm) {
  7.     client_info_s* info = (client_info_s*)parm;
  8.     u8* rec_data = sys_malloc(1500);

  9.     WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id,
  10.         inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);

  11.     while(1) {
  12.         s32 ret = read(info->id, rec_data, 1500);

  13.         if(ret > 0) {
  14.             WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);
  15.             ret = write(info->id, rec_data, ret);

  16.             if(ret <  0) {
  17.                 WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id,
  18.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
  19.                 sys_free(rec_data);
  20.                 osThreadExit();
  21.             }
  22.         } else if(ret < 0 ) {
  23.             WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id,
  24.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
  25.             close(info->id);
  26.             sys_free(rec_data);
  27.             osThreadExit();
  28.         }            
  29.     }
  30. }

  31. typedef struct {
  32.     u16 port;
  33.     u8 cnt;
  34.     u8 rvd;
  35. } server_parm_s;

  36. void create_tcp_task(void* pram) {
  37.     server_parm_s parm;
  38.     memcpy(&parm, &pram, 4);
  39.     WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);
  40.     int listenfd, connfd;
  41.     struct sockaddr_in servaddr;
  42.     struct sockaddr client_addr;

  43.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
  44.     {
  45.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
  46.         while(1);
  47.     }
  48.     memset(&servaddr, 0, sizeof(servaddr));
  49.     servaddr.sin_family = AF_INET;
  50.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);            
  51.     servaddr.sin_port = htons(parm.port);

  52.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
  53.     {
  54.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
  55.         while(1);
  56.     }

  57.     if( listen(listenfd, parm.cnt) == -1)
  58.     {
  59.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
  60.     }

  61.     while(1)
  62.     {
  63.         socklen_t socklen = sizeof(client_addr);
  64.         memset(&client_addr, 0, sizeof(client_addr));
  65.         if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)
  66.         {
  67.             WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno);
  68.             continue;
  69.         }

  70.         client_info_s* client = sys_malloc(sizeof(client_info_s));

  71.         if(client) {
  72.             client->client_info = *(struct sockaddr_in*)&client_addr;
  73.             client->id = connfd;
  74.             client->port = parm.port;
  75.             osThreadNew(client_proc,(void*)client, NULL);
  76.         }

  77.     }
  78. }

  79. void create_tcp_server(u16 port, u16 cnt){
  80.     server_parm_s parm;
  81.     parm.port = port;
  82.     parm.cnt = cnt;
  83.     u32* ptr =(u32*)&parm;
  84.    osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL);
  85. }
复制代码

非阻塞方式:

  1. void trace_task(void *argument) {
  2.     const TickType_t xBlockTime = pdMS_TO_TICKS(50);
  3.     u8* read_buf = malloc(128);
  4.     WDBG("TCP SEVER port:%d", 1234);
  5.     int listenfd = -1;
  6.     int connfd = -1;
  7.     struct sockaddr_in servaddr;
  8.     struct sockaddr_in client_addr;

  9.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
  10.     {
  11.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
  12.         while(1);
  13.     }
  14.     memset(&servaddr, 0, sizeof(servaddr));
  15.     servaddr.sin_family = AF_INET;
  16.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);            
  17.     servaddr.sin_port = htons(1234);

  18.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
  19.     {
  20.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
  21.         while(1);
  22.     }

  23.     if( listen(listenfd, 3) == -1)
  24.     {
  25.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
  26.     }

  27.     {
  28.         DWORD nMode = 1;
  29.         ioctlsocket( listenfd, FIONBIO, &nMode );        
  30.     }

  31.     fd_set fdRead;
  32.     fd_set fd_err;
  33.     struct timeval tv;
  34.     socklen_t socklen = sizeof(client_addr);
  35.     memset(&client_addr, 0, sizeof(client_addr));

  36.     while(1) {
  37.         FD_ZERO(&fdRead);
  38.         FD_ZERO(&fd_err);  
  39.         FD_SET( listenfd, &fdRead);
  40.         u8 cnt = 2;
  41.         if(connfd != -1) {
  42.             cnt++;
  43.             FD_SET(connfd, &fdRead);
  44.             FD_SET(connfd, &fd_err);
  45.         }

  46.         if(connfd != -1) {
  47.             u32 rec_size = xStreamBufferReceive( g_trace_handle,
  48.                     ( void * ) read_buf, 128, xBlockTime);
  49.             if(rec_size) {
  50.                 s32 ret = send(connfd, read_buf, rec_size, 0);

  51.                 if(ret <  0)  {
  52.                     closesocket(connfd);
  53.                     connfd = -1;
  54.                     continue;
  55.                 }
  56.             }

  57.         }

  58.         tv.tv_sec  = 0;
  59.         tv.tv_usec = 20000;
  60.         s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);

  61.         if(ret == 0) {

  62.             continue;
  63.         }

  64.         if(ret > 0) {
  65.             if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
  66.                 connfd = -1;
  67.                 continue;
  68.             }

  69.             if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.
  70.                 ret = recv(connfd, read_buf, 128, 0);
  71.                 if(ret < 0) {
  72.                     closesocket(connfd);
  73.                     connfd = -1;
  74.                     continue;
  75.                 } else if(ret >0) {
  76.                     WDBG("rec size:%d", ret);
  77.                 }
  78.             }   

  79.             if(FD_ISSET(listenfd, &fdRead)) {
  80.                 s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);
  81.                 // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));

  82.                 if(connfd == -1) {
  83.                     connfd = temp;
  84.                 } else {
  85.                     closesocket(temp);
  86.                 }
  87.             }        
  88.         }
  89.     }
  90.     #endif
  91. }

复制代码

收藏 评论0 发布时间:2021-12-13 22:35

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版