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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:35
STM32F7 LWIP socket 创建TCP server
1 h+ m3 `- l4 K  n1 L
  1. **阻塞方式:**
复制代码
  1. typedef struct {
    . X6 w' o% w1 F3 Z, v9 U
  2.     struct sockaddr_in client_info;
    0 I" D% C$ u' u5 O
  3.     s32 id;$ A1 A- W0 b) k. M  J/ [; ~
  4.     u16 port;# c9 U  k9 U1 {7 Q
  5. } client_info_s;
    6 Q8 {  [. k3 y+ s! _
  6. ( x+ D7 O4 i0 \0 m3 w) d
  7. void client_proc(void* parm) {" Y4 j, ?' s/ z3 t% m, L
  8.     client_info_s* info = (client_info_s*)parm;+ C, M' h9 l4 I. \# A% V
  9.     u8* rec_data = sys_malloc(1500);
    " }! D7 E* o6 H5 r
  10. 7 V3 r# j% G5 m& V( ?
  11.     WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id,
      w2 X$ F, c, O$ u0 j3 t6 ^
  12.         inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);- a* Y( {: o- Q6 a+ l6 }! }# g" [

  13. & h1 v8 o. A3 I4 Z( ^2 {* N
  14.     while(1) {
    2 D% a: s' k, O7 j' [
  15.         s32 ret = read(info->id, rec_data, 1500);2 P  K3 G: |+ @. C+ S- Y

  16. # C  L0 {9 I0 a; O# H
  17.         if(ret > 0) {5 @( N# O9 z9 q- L# I
  18.             WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);$ @+ d) U/ X# X3 J
  19.             ret = write(info->id, rec_data, ret);5 A. \! x& d) l9 G

  20. 4 x" H. p; X4 P. M, T. p
  21.             if(ret <  0) {
    0 y& E; S- _0 m! k+ [+ [
  22.                 WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id,
    0 _% x: V# @4 D/ N2 O/ [& Z1 A6 s
  23.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
    % q- b, I4 [1 `8 D
  24.                 sys_free(rec_data);  S2 q4 L/ _5 l& l, v
  25.                 osThreadExit();
    1 ]" d" N! z9 v9 O8 J( J& w
  26.             }% O- M1 J0 I  Z, J/ a
  27.         } else if(ret < 0 ) {' G; h. G4 r9 q+ @0 N
  28.             WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id,
    9 j. n2 q8 I8 P% k4 i
  29.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);& N0 {' Y6 U; B" [7 @
  30.             close(info->id);+ C& b3 C* g& h
  31.             sys_free(rec_data);
    6 U1 I5 S, F- J  n5 G
  32.             osThreadExit();
    . M; W' S+ d1 B9 O, |" O) y
  33.         }            3 Q6 _7 X( }& P$ ?+ ]: w7 x' z& X
  34.     }' S/ Y3 ]* b8 c7 G0 a
  35. }  Q3 j- B( P& c' R

  36. ) T7 W1 |% B+ y4 |7 R
  37. typedef struct {+ k$ k. p& ]. D3 q5 H3 B, A
  38.     u16 port;
    : R0 N6 A7 h" k
  39.     u8 cnt;" U* y. G% J$ S) x$ g& [3 {* B
  40.     u8 rvd;
    5 q# y* D4 o' t5 H7 G
  41. } server_parm_s;
    3 O- E5 S$ |1 X/ s3 d  P

  42. - I7 }8 Z, V# F, k4 O  a
  43. void create_tcp_task(void* pram) {5 o8 u$ B+ g# Y3 D5 u: ]$ {4 J
  44.     server_parm_s parm;; ]' {- I0 z2 c1 g' Q! j. {* r
  45.     memcpy(&parm, &pram, 4);
    * i# H) R/ m; y7 t" o9 o2 U
  46.     WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);
    , y) p) ?* v" O1 e: }: O' P: `
  47.     int listenfd, connfd;
    / U" N1 R+ X5 m5 z6 \; }& m
  48.     struct sockaddr_in servaddr;
    , l( y' @- e# N8 _8 |$ u+ Q
  49.     struct sockaddr client_addr;
    ! i' j4 T' {+ E- J

  50. $ R# w; K  f  }: j/ R( Z+ L
  51.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
    + |- i4 _$ P" f
  52.     {
    % f; B- i; G/ e# \9 W, e
  53.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);2 ~: A( B; N: n; M% S! Z
  54.         while(1);/ L9 c8 [- S( Z- C' ~
  55.     }
    ' o; @6 Q  b# g2 m% M5 o1 S
  56.     memset(&servaddr, 0, sizeof(servaddr)); ' \2 ]- i+ ~; J2 R  m% p5 a3 e
  57.     servaddr.sin_family = AF_INET;
    ' A; y7 i. `7 u: t
  58.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);            
    6 [0 C7 R$ R# h5 E; |) P* X
  59.     servaddr.sin_port = htons(parm.port);
    6 X7 A1 o9 D! a, ~. Q
  60. $ k  J  C* v# f! T3 {" E! R
  61.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)- A9 q: M1 @* W1 ?. ^  S7 U
  62.     { * i7 M& [" W' r) s
  63.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);) a5 d0 _* V; a3 N  c$ J3 o! n2 ?
  64.         while(1);( u+ L* |" u0 H$ Z0 i+ A4 E
  65.     }
    - L& U% x0 N9 B3 H+ W$ @' ^. A! b8 ]% r
  66. ' ?/ |8 `8 B1 D
  67.     if( listen(listenfd, parm.cnt) == -1)
    . ]- T6 b! H4 T% |4 _2 v+ a: C. b
  68.     { , q+ Y! Y) S: q- w* K1 E9 m
  69.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
    ) u/ ~! q9 T% m. W$ M
  70.     }
    $ Z, C. S7 |' Y+ G! A4 w2 R

  71. 4 [! i* t7 L, q  {. ~  W
  72.     while(1)
    3 m2 [# w& i  w, I
  73.     { & F7 M+ |6 S- V6 S2 X
  74.         socklen_t socklen = sizeof(client_addr);
    - y: \) ~" G: k. z
  75.         memset(&client_addr, 0, sizeof(client_addr));
    1 S' ~- f3 ^& a/ s
  76.         if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)1 V6 j/ H/ \" I
  77.         {
    1 ?# ]# C7 M, e6 ~2 g% f
  78.             WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno);
    0 y3 ^: q/ Y) r; Z' _5 R
  79.             continue;
    8 L0 `: K* k4 s$ ~/ h" _. G
  80.         }
    6 K& K8 D8 ]* b8 R) |6 W" F0 ?' f# S1 _

  81. # w/ i- x; L; H; i: j
  82.         client_info_s* client = sys_malloc(sizeof(client_info_s));* {/ @& Y8 Y& _- w# I

  83. ! c2 d' f6 H: y$ |$ g$ L$ v, a
  84.         if(client) {
    ! G6 g1 T& @$ e0 z0 k
  85.             client->client_info = *(struct sockaddr_in*)&client_addr;. W& ~7 }( Y$ h, M# G9 m
  86.             client->id = connfd;, G$ V- C5 ?7 v5 U* B8 p$ B
  87.             client->port = parm.port;  |( D8 Z1 J6 e
  88.             osThreadNew(client_proc,(void*)client, NULL);; g& v  G/ O6 W5 W- r( d
  89.         }
    1 ^$ o/ z) h* W
  90. 3 T7 D5 d6 q, y  \
  91.     }
    0 ~% }1 d3 ]4 {5 t
  92. }# V; W  r3 w  y4 e0 s4 ?
  93. / f* o8 U* E% E: p% V
  94. void create_tcp_server(u16 port, u16 cnt){7 \, o. V% M; Y2 O
  95.     server_parm_s parm;
    1 h/ L: f, j& F9 V
  96.     parm.port = port;
    1 Q/ n, x5 P2 C) Q7 H0 S% A: _8 N
  97.     parm.cnt = cnt;2 X# O' s* p1 s
  98.     u32* ptr =(u32*)&parm;" d2 p% J  U' I$ @
  99.    osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL);
    ; _% ?( F2 g& j6 R2 ?: I; S5 m
  100. }
复制代码
3 X  q) ]6 [6 [
非阻塞方式:
% R4 G0 w6 l5 c1 L
- n( y0 ?7 h$ U5 L% h, o
  1. void trace_task(void *argument) {
    7 O$ i1 K0 l7 |4 |( I) H1 k
  2.     const TickType_t xBlockTime = pdMS_TO_TICKS(50);/ p3 i4 b& b6 d1 D' O3 q3 N
  3.     u8* read_buf = malloc(128);
    ' y8 h5 O3 D5 d; u4 v( B- g; B
  4.     WDBG("TCP SEVER port:%d", 1234);# k+ [$ n1 z9 a' _/ h  s! u
  5.     int listenfd = -1;
    7 n/ l* m4 h2 A2 S* b$ U
  6.     int connfd = -1; 3 j. a: i1 b9 g
  7.     struct sockaddr_in servaddr;
    9 G; @9 y; Z% ?! d4 M6 A9 [
  8.     struct sockaddr_in client_addr;
    4 k7 ^" {" |8 [" k) ~; \, s
  9. 5 v: X$ D: G' w6 j
  10.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )" U& s7 r4 \. p
  11.     {
    ! j1 R5 E# l+ w6 e1 h" J
  12.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);* m# R4 i' }- n% H3 i0 J; d" k" Z
  13.         while(1);
    ( a  r: j: X6 A1 u7 B2 N5 m5 A8 f5 L
  14.     }
    + ?1 n- T6 \. I9 o3 ]
  15.     memset(&servaddr, 0, sizeof(servaddr)); 6 a7 S1 m  G" w6 C+ x3 @
  16.     servaddr.sin_family = AF_INET; . u4 B1 B- j8 f. t
  17.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);             8 [# L7 K% G; j9 ?1 o6 H
  18.     servaddr.sin_port = htons(1234);
    & O5 z+ A1 G  \; ^3 w
  19. 0 I" |7 p& o7 W& P( s
  20.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)) G3 i) x& h9 M7 {1 [9 m# T) J
  21.     { ( }- F, n9 V& p" _( u
  22.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
    3 p% V" L7 d+ \9 U
  23.         while(1);
    " ?& m% K4 F7 R2 v( \1 Y
  24.     }
    9 x: N/ D; Q" R1 C/ E& T3 v
  25. ' P: j- t% ~! a7 ]" L+ Z
  26.     if( listen(listenfd, 3) == -1)6 w8 y- r( F7 e: l" G
  27.     {
    . G/ S' J4 `7 _; F4 A, N2 F
  28.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
    * F2 @* |  L+ I" e" L) o
  29.     } $ \2 R4 h) o6 {+ f$ x  c: O0 a

  30. 5 p  w# N9 N( Q' O# c/ Z
  31.     {
    + o: }( ~+ `) @9 j$ U
  32.         DWORD nMode = 1; % t+ \- V6 f/ l, d) m, K/ g
  33.         ioctlsocket( listenfd, FIONBIO, &nMode );        
    9 x- w# D( B5 e4 H
  34.     }
    : d  o# g3 X, B& h! @$ B9 r
  35. 5 u! P7 G' B1 \+ B
  36.     fd_set fdRead;
    ) _) p. w3 ^9 A9 G7 v. W
  37.     fd_set fd_err; 4 W- r: H! E  l; Z" L
  38.     struct timeval tv; : k+ J+ b! n4 e0 A& N
  39.     socklen_t socklen = sizeof(client_addr);
    . o. `; w7 R5 W
  40.     memset(&client_addr, 0, sizeof(client_addr));4 g- p% L+ I+ a# f& j0 L. C

  41. ) c% R- O2 J7 c7 h; E$ ]
  42.     while(1) { , N, z* L) s) G3 y4 C
  43.         FD_ZERO(&fdRead);, I) P. K  w* X3 ]* {9 W! O4 E% a7 k
  44.         FD_ZERO(&fd_err);  : x- _) ?/ M7 k- q5 a9 Y$ ~
  45.         FD_SET( listenfd, &fdRead); 4 M! D$ ^/ D( `' |9 W7 M4 A. O  T
  46.         u8 cnt = 2;& m( H, N5 @- ]5 N
  47.         if(connfd != -1) {2 O- H7 H; q1 O" x9 a' h
  48.             cnt++;
    6 @+ P) ^+ L/ @3 P" H
  49.             FD_SET(connfd, &fdRead); 4 n; K' [. L/ l! N0 w
  50.             FD_SET(connfd, &fd_err);* l' E, `" _# @, U* N% h
  51.         }# `* n4 g2 e7 J9 f* b2 |* j1 e
  52. ! t( ~2 B3 T) d8 b
  53.         if(connfd != -1) {3 w; b4 t) u. p+ \
  54.             u32 rec_size = xStreamBufferReceive( g_trace_handle,
    ; _+ }, I& q% z# h$ Q/ ^. N: B
  55.                     ( void * ) read_buf, 128, xBlockTime);
    6 y. Y6 d; j2 ^7 [4 r# r
  56.             if(rec_size) {
    2 t9 ], y4 G0 K! X/ D
  57.                 s32 ret = send(connfd, read_buf, rec_size, 0);
    4 |6 v7 i9 \& G0 K  }9 B

  58. & T3 y/ e6 y9 o( l5 p2 L# M
  59.                 if(ret <  0)  {5 w1 _7 [6 s  M4 |' B& R& G4 z
  60.                     closesocket(connfd);
    6 ~1 t* }: S+ w) a; a. k  l
  61.                     connfd = -1;
      Z6 c7 V" F$ |' n5 H5 B
  62.                     continue;9 T- ]; r' `! f- N
  63.                 }! ^) {( S. V! x
  64.             }
    % x' {) p3 [; n5 Q

  65. 6 Q0 B" w; S9 ^$ Q1 }! \* d
  66.         }* f% c1 G* S6 H& ]* S3 i4 R# `
  67. . f; b+ F' U" i& d- g
  68.         tv.tv_sec  = 0;
    * h, }: P+ g$ @- J9 Y
  69.         tv.tv_usec = 20000;
    6 }1 Y. A% S. l, p
  70.         s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);+ C1 ?! t6 B$ D$ K

  71. 1 B. j' D# }* x9 J( u9 l
  72.         if(ret == 0) {- n( x7 u3 d. i8 @! |4 n% M; w
  73. + G# Y! F+ \: b- E& o
  74.             continue;" P, X" {% v7 f4 T
  75.         }
    ; o! u- h% E3 l
  76. 5 Z; j. `. b& [2 Q
  77.         if(ret > 0) {1 Z; g8 C8 a# R8 S
  78.             if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
    ' Q9 N) {0 p& m3 d) ?
  79.                 connfd = -1;0 s0 ?7 W! D, i$ s
  80.                 continue;
    ( _9 V2 A# S/ S& I
  81.             } ' j2 r% [4 k3 d
  82. & `% N# j3 Q+ N6 m- k% G' G, M7 b
  83.             if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.
    # U2 w; A5 F/ k  ?, q
  84.                 ret = recv(connfd, read_buf, 128, 0); , o( L8 i1 J  B1 Y( \& y2 J+ g
  85.                 if(ret < 0) {
    7 @8 q9 o, |' h1 e8 \) l
  86.                     closesocket(connfd);4 ~4 T) C  y* {- B
  87.                     connfd = -1;; `; ?% L- u- e' p1 Z
  88.                     continue;" m4 {4 I" @* r
  89.                 } else if(ret >0) {3 Z* p& p6 |" w. S# G
  90.                     WDBG("rec size:%d", ret);
    & i% L. f  a" E/ `4 l) Z2 J/ ]. _
  91.                 }
    % O& N) R4 a" I' \
  92.             }   $ }3 C; ]  C# p

  93. & }1 L4 h  Y) w" z5 P
  94.             if(FD_ISSET(listenfd, &fdRead)) {# s, G0 A5 r& M! J" d* |
  95.                 s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);
    7 T+ ^6 ?3 a$ q; S$ T5 ]4 x4 x
  96.                 // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
    " G$ s6 _1 m1 V; O  R4 E

  97.   q% F1 e+ }* h" z8 {: z% a) s
  98.                 if(connfd == -1) {
    $ p% A+ G) d; A* X
  99.                     connfd = temp;2 O% h! u6 e! D0 `3 j$ D* Y
  100.                 } else {
    ; x% Z/ u5 ?2 R* N
  101.                     closesocket(temp);
    4 U+ B# D' K# k' f6 a' R, Z$ V: P. t4 {
  102.                 }
    5 J& u3 i" R, _" p2 l. A; I) X! B
  103.             }        % X) @4 l& t1 q& l0 ]% x
  104.         }$ Q' t: N7 M, h2 y
  105.     } ; I( N8 `: c2 C2 D% T" B
  106.     #endif( b+ F* g- P# K7 l6 h( u
  107. }6 S1 O4 P( P% X0 b; w

  108. + x( A( B9 \. O/ U$ k$ D
复制代码

; j; A( t  _! u7 l1 f/ I
收藏 评论0 发布时间:2021-12-13 22:35

举报

0个回答

所属标签

相似技术帖

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