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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:35
STM32F7 LWIP socket 创建TCP server5 F3 ?) B& d3 H
  1. **阻塞方式:**
复制代码
  1. typedef struct {. p9 @8 d% J: J8 V) Y" L- W
  2.     struct sockaddr_in client_info;5 m% C. v: P( ~, N0 v+ i1 ~
  3.     s32 id;
    ! L, ^2 r2 c, g2 q, ~' K& Q
  4.     u16 port;
    2 O8 F; c1 H- A. S& d2 {
  5. } client_info_s;1 k3 d% {0 U( b# o6 L

  6. ! c  j- R: H& d/ ]) m4 W5 [
  7. void client_proc(void* parm) {3 z5 u! _, N8 O0 i0 B
  8.     client_info_s* info = (client_info_s*)parm;
    6 f; N' |. F# b! ^' \  Q
  9.     u8* rec_data = sys_malloc(1500);
    6 e+ h) G  [$ R; u' i1 V

  10. ; K8 v/ Y" X$ o4 s: l; j- G: c
  11.     WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id,
    9 S5 D0 X0 @; x
  12.         inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
    ( [" ^  w. w3 w1 J) D/ k2 k
  13. # k  J, F- \/ u: f
  14.     while(1) {
    % t/ Z( l7 s0 r( k4 B
  15.         s32 ret = read(info->id, rec_data, 1500);* e2 w( S' m4 C/ D  x& `2 t

  16. + A; U! X' l3 i  @
  17.         if(ret > 0) {% |8 F' L' t' p+ f
  18.             WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);
    - }8 n& r# g3 ^2 J. H
  19.             ret = write(info->id, rec_data, ret);
    ! \" y7 D  y. G9 p* Z+ a1 R

  20. ' H$ e( i- Q2 l, r  ^
  21.             if(ret <  0) {, \" b3 q! u5 d' W/ E6 n/ J
  22.                 WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id,
    1 k0 g0 `# T% c2 O" L
  23.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);* R) [2 q7 i, x
  24.                 sys_free(rec_data);7 d0 e. Q- j& n# t1 [1 g
  25.                 osThreadExit();
    , x% v( D) y& L
  26.             }
    , P2 _0 F$ N" o/ T0 ?5 g
  27.         } else if(ret < 0 ) {  i# b: F* k6 j% r
  28.             WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id,   W* G' Y3 d6 `0 l
  29.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);) R2 D/ C( Q0 f7 d- H: L3 T
  30.             close(info->id);
    $ Z3 Q- p: S" c9 T, z8 n6 Q
  31.             sys_free(rec_data);: s4 n1 c& H; M
  32.             osThreadExit();
    " q, ]5 c* D8 i* u( x
  33.         }            * L" [) z7 l4 L; P& i* c5 }
  34.     }
    , W" E2 x4 Y+ A" p( v
  35. }; [+ T2 t& ?; {/ H7 K

  36. ( \5 @& B) ^7 o
  37. typedef struct {$ ^1 Y& x; Z) F; t; n) U
  38.     u16 port;# j) S  ?9 ~  g- E. Z4 I" y2 |7 o
  39.     u8 cnt;
    " F; l0 _$ m+ T* {' }
  40.     u8 rvd;
    " F0 D! b" x( y- k" s; I* W
  41. } server_parm_s;, g5 Y1 m$ A1 R* y- ^* [
  42.   s0 b/ V  d) m
  43. void create_tcp_task(void* pram) {# W6 L1 A& y4 h% ~  \9 u
  44.     server_parm_s parm;
    + @$ c) X. i2 y7 L
  45.     memcpy(&parm, &pram, 4);/ `& B4 q2 _- q+ B! Y
  46.     WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);
    ) }( O* f4 {7 V( b0 |
  47.     int listenfd, connfd;
    3 |# z6 T' R3 l( b
  48.     struct sockaddr_in servaddr;
    ) n, `7 M/ k  x9 m' h8 H
  49.     struct sockaddr client_addr;% u5 k0 ?- }0 N

  50. ' j# w( E# z- I. E, g; u
  51.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ): {7 Q1 F* c4 W; O" S! c
  52.     { . m, z' l6 d* V$ ~' m# [% m
  53.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
    7 d; X  }" j* c$ o) Y, E
  54.         while(1);, c6 k& ?! X: L4 a* U/ I* W; o' J
  55.     } 2 Z( \, b$ z- f' E1 J
  56.     memset(&servaddr, 0, sizeof(servaddr));
    * S7 V. S5 M* u5 x1 |
  57.     servaddr.sin_family = AF_INET;
      D* w# Z6 W  y( J. G3 o$ J
  58.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);             2 u3 q5 h4 e2 ]' H: E
  59.     servaddr.sin_port = htons(parm.port); + Y% g; T. A+ I. \2 i

  60. 3 @2 w  l6 ?& n) T  I2 {
  61.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)7 P* e) G4 J1 d9 v
  62.     {
    ( \- [& c8 ~$ S
  63.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);" c" |# U! ~& T% c, D2 ~  U& U
  64.         while(1);
    , f& b8 t' x1 C0 Z) a# G
  65.     } 0 a4 y' c' Q8 H( ?6 ^
  66. 8 c2 r6 K/ b) |: w* Y: l" U. A7 V% x
  67.     if( listen(listenfd, parm.cnt) == -1)
    + n# y) s& `6 l3 J, [' k
  68.     { 5 f) m' w1 m( r
  69.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);* h& @/ ]. ~& O7 n" M
  70.     }
    , a& U5 d+ @! \8 G: n  Z- l! o
  71. 5 x1 r/ q, b! x+ D
  72.     while(1)
      C2 Q4 g# M( R+ L. A$ A
  73.     {
    ) l& h% D- t0 ~4 n" s
  74.         socklen_t socklen = sizeof(client_addr);7 k5 h1 K; D" ^- i
  75.         memset(&client_addr, 0, sizeof(client_addr));6 X3 _3 p# y# U1 P9 x
  76.         if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)
    $ e6 r. `; Z2 n1 S/ t
  77.         {
    $ R' @3 Q4 w- q5 m2 m
  78.             WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno); 9 ~! d6 w: i' ?) ~! G, f
  79.             continue; 4 Y' G& R' ]" s
  80.         }
    ( v3 ?. @: T% W) \  U2 m  [

  81. / a7 s+ [, g* O0 T' v5 S
  82.         client_info_s* client = sys_malloc(sizeof(client_info_s));
    ! p& P) O$ r0 l2 \0 x0 H

  83. * i  t" x$ K* n" {4 L+ ^8 l" f
  84.         if(client) {
    & S4 Q5 h, q' u9 i1 m- O
  85.             client->client_info = *(struct sockaddr_in*)&client_addr;0 P- m* N( k' b! C/ d
  86.             client->id = connfd;" |# f9 K, N) c- H4 x$ C
  87.             client->port = parm.port;
    7 p1 e: s3 H8 z; D- r$ w5 l) H4 D
  88.             osThreadNew(client_proc,(void*)client, NULL);
    8 M) A( L. m9 N8 ?3 h4 y, K$ Q
  89.         }4 j# d+ b0 ?7 A1 u, C# G8 f, ]+ y

  90. ' ]/ d% p- C  T
  91.     }
    ! {! a% B5 f9 q) z4 ~' j
  92. }0 |' _* `! A5 }: \
  93. 6 {/ f' \' l# T# w  N2 x1 P
  94. void create_tcp_server(u16 port, u16 cnt){
    # c3 F9 z: S. R: p$ e
  95.     server_parm_s parm;
    5 L! i: r+ M& m- t1 @' v7 _
  96.     parm.port = port;
    . g! @" o# b, b- r5 F1 |- a# X
  97.     parm.cnt = cnt;/ i. M/ Y2 o: b6 g) k
  98.     u32* ptr =(u32*)&parm;9 d$ w8 v( ^( I1 b
  99.    osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL);
    ' ~, l, Z" e3 D" a
  100. }
复制代码

" B) e, T2 Y6 W非阻塞方式:
1 D1 }5 P6 O- X7 |7 }
+ n. I% Q  `: ~& Q+ h8 y
  1. void trace_task(void *argument) {  Z7 n+ K) A8 z. D- r
  2.     const TickType_t xBlockTime = pdMS_TO_TICKS(50);
    ' v1 r5 ?/ J6 g
  3.     u8* read_buf = malloc(128);
    ) d! c# a; @; q" ]' y' H6 a
  4.     WDBG("TCP SEVER port:%d", 1234);
    4 {0 t' f0 x$ w* f/ N
  5.     int listenfd = -1;
    9 b) A, ?* \+ ~3 Q' x1 v, M* c
  6.     int connfd = -1;
    / n# D- s4 F, z2 n* F: G
  7.     struct sockaddr_in servaddr; & ], l; [, z4 ~
  8.     struct sockaddr_in client_addr;2 `, H+ J) W; B- b6 F9 O8 O

  9. " w6 L6 O% Y* p0 P6 T- _7 b
  10.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ): h  u% a, w: ~) q  v
  11.     { $ G" q8 F; t% w2 n. A" {9 g
  12.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
    # E4 R5 A6 s: }9 r: B6 z
  13.         while(1);+ F/ P) R/ q+ X& [/ ]
  14.     }
    ) {: S# `& v6 d  N
  15.     memset(&servaddr, 0, sizeof(servaddr));
    2 V8 j6 G3 w5 M7 ^) i
  16.     servaddr.sin_family = AF_INET; $ a" N+ j) O1 o$ e* k9 Q
  17.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);             + S9 ~# [3 n+ e* W/ N# A; ?  i
  18.     servaddr.sin_port = htons(1234); ' s0 L, [* H6 ]5 N$ ]4 o8 T1 p

  19.   h$ B$ p+ g- ]# e$ M
  20.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1): ], e/ V8 T9 ]
  21.     { 2 Q" a8 P& k1 v5 I
  22.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
    ( }; o) T9 X  o( r; M
  23.         while(1);
    ; J9 \* o( M- b. q; \) @
  24.     }
    2 W2 W( E% M; E4 Z1 T
  25. 2 E# z) Y6 g, {4 g+ q  _9 W
  26.     if( listen(listenfd, 3) == -1)
    " U- N9 p1 S0 \4 l* P4 o
  27.     {
    - ?( J$ Q/ T9 N7 Q% X! v% ?
  28.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
    ! }% i# g: T  K8 N" G8 g3 h
  29.     }
    - f2 G: j; f8 Z4 q6 u, b; _

  30. 3 W9 O1 u+ N. M6 M
  31.     {
    0 w4 o  I- U' @+ a2 w1 m( x1 N
  32.         DWORD nMode = 1;   S/ `" y& n' c0 c% m
  33.         ioctlsocket( listenfd, FIONBIO, &nMode );        - `( R& L2 L7 w0 ~
  34.     }. \" C7 s9 a! U

  35. % T' x: e) p6 D
  36.     fd_set fdRead;
    & O% K3 q# W' a
  37.     fd_set fd_err; 7 o! k0 R- k& X
  38.     struct timeval tv;
    1 X/ U: p% `3 j$ g
  39.     socklen_t socklen = sizeof(client_addr);6 d5 |" j% |' I2 [! P& \: J: l
  40.     memset(&client_addr, 0, sizeof(client_addr));% B  S# d. |) j4 Z& X
  41. 7 [# Y4 c* ~- p5 H. Z/ H/ G
  42.     while(1) { # J- C% v: B5 C0 n$ X$ W- c
  43.         FD_ZERO(&fdRead);
    - L! q" U7 X  f/ b- {) p
  44.         FD_ZERO(&fd_err);  
    3 N8 |! v6 Z+ }; s1 b; x
  45.         FD_SET( listenfd, &fdRead);
    . Y# K: Z' b# w
  46.         u8 cnt = 2;
    5 H, c% O9 i$ r! E/ V1 a1 Q) X  D# m
  47.         if(connfd != -1) {( s0 |* K3 h. S9 I
  48.             cnt++;
    1 c& v* V$ B4 }' ~  c
  49.             FD_SET(connfd, &fdRead);
    9 Y" X8 D9 q0 e( `
  50.             FD_SET(connfd, &fd_err);
    9 n  Q5 |* E5 ~9 C  P( ^; s- Z9 I7 F
  51.         }/ r& x, d' X( k% [
  52. ( S4 y- f( y3 i0 X
  53.         if(connfd != -1) {
    0 j: D% h/ m7 z, h2 y. _# o
  54.             u32 rec_size = xStreamBufferReceive( g_trace_handle,$ g( l( q! k" t
  55.                     ( void * ) read_buf, 128, xBlockTime);4 o7 O6 d, I6 c
  56.             if(rec_size) {
    7 ^- K- g0 t; k) b
  57.                 s32 ret = send(connfd, read_buf, rec_size, 0);
    1 S. F; D6 m8 {

  58. ) ?/ t- u7 t, _; U
  59.                 if(ret <  0)  {
    ; {4 q0 x' C' u; w' _
  60.                     closesocket(connfd);
    7 U3 t0 {, S* g4 @8 P8 m
  61.                     connfd = -1;# G# y4 C1 p/ f" m* x) M
  62.                     continue;
    $ j1 b1 n; J. j4 W% G
  63.                 }4 p4 z. k+ p- i9 C3 u9 U
  64.             }: o6 L( k) W4 Z1 L+ w8 a9 K
  65. 4 g. x4 V# W1 I8 e- |8 ]- z
  66.         }7 @0 k) T* Z' u8 @3 K8 T
  67. 1 a8 ~& G3 D$ m
  68.         tv.tv_sec  = 0;7 B) Q2 h- {  s* N7 T$ U! k
  69.         tv.tv_usec = 20000;* \% J, k4 ^9 f& |7 ?
  70.         s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);
      Y1 z' B9 F+ ]1 M3 |. I8 Z0 N1 ?
  71. 3 z; G, u% A" ~  ^3 v8 Y1 Q. n
  72.         if(ret == 0) {9 @/ n9 l& E: E" [+ ?  l6 j- g

  73. ( B: `* {- c  d; l: N1 c
  74.             continue;
    ) y- A$ i8 L" o6 E% W( n( ^
  75.         }
    4 j/ R; g9 n" r/ s0 f

  76. . J% a! P8 K7 q' ?7 n+ g% Q( s
  77.         if(ret > 0) {& R4 f* T, n. T' q
  78.             if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
    7 W: D7 S" l' a& P' Q
  79.                 connfd = -1;
    2 N8 b$ k( I  I) C7 w& K
  80.                 continue;
    * Y/ H6 H3 z1 m$ r4 e
  81.             }   f" c0 V5 N" o* Z' T

  82. 2 T+ t; {, M9 l# t. _
  83.             if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.
    ( M7 A+ r! b2 n
  84.                 ret = recv(connfd, read_buf, 128, 0);
    ) L  j, L$ L$ o! ^/ t: @6 |
  85.                 if(ret < 0) {, `, c; c, E4 q) |6 d
  86.                     closesocket(connfd);" Z: R9 g5 j+ O4 k0 k  F
  87.                     connfd = -1;
    $ X0 f* d4 x* B! I
  88.                     continue;
    6 I$ K; ^3 W5 [* L" r% s
  89.                 } else if(ret >0) {: V2 O' Z' X# c" ]
  90.                     WDBG("rec size:%d", ret);
    6 u! C7 I9 u2 M( u; ?$ d
  91.                 }$ c% ?1 Q" D  m5 D/ _; V' ]
  92.             }   - d" r, H7 q  D3 @7 K
  93. + ?2 s9 T5 E% O% Q4 T; c$ {
  94.             if(FD_ISSET(listenfd, &fdRead)) {2 c! \% J2 ~9 A. W4 a
  95.                 s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);
    0 q0 i  V$ B* V/ a% I( k9 {
  96.                 // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); * |5 v5 o5 k1 O! o9 Z+ g1 F, B- g( F
  97. 2 T& A2 G$ |8 I, v
  98.                 if(connfd == -1) {' I% p$ q) }8 i2 s
  99.                     connfd = temp;" g( X2 k6 e( U) l9 ^/ Y- R1 m
  100.                 } else {
    9 K2 \, K1 n' g; s7 X- Y
  101.                     closesocket(temp);
    - Z; j8 |2 p0 M& ~& c
  102.                 }/ |- Y2 o- R# ?1 B8 q
  103.             }        
    0 L& V6 x1 ~. o: l, J! c
  104.         }
    ) f; Z! ~6 ]0 h( B( W$ X
  105.     }
    ) d  a' K" s* D0 c, u( @- g
  106.     #endif) [8 u/ ]9 G4 P8 v; b3 g
  107. }
    5 h% ]0 a( C* K1 l8 f) o
  108. # ?% [0 B  ~, f' o- C2 e: X( D
复制代码

9 q# K" u5 M& w
赞 收藏 评论0 发布时间:2021-12-13 22:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版