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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:35
STM32F7 LWIP socket 创建TCP server6 ~4 u, [$ }" o; S4 U; w' n: }
  1. **阻塞方式:**
复制代码
  1. typedef struct {4 I  Q3 O3 S  i) r8 |
  2.     struct sockaddr_in client_info;4 l+ c9 r) [# C" C: ^
  3.     s32 id;
      l8 e0 P1 q1 R: j2 y5 f8 q- V8 {& I. J
  4.     u16 port;
    6 V+ d3 s; N, M8 a. C
  5. } client_info_s;; K/ x( _* v* b! c
  6. 1 ^' @% I0 b0 u+ e: M
  7. void client_proc(void* parm) {
    7 I' I/ M' x' R6 V
  8.     client_info_s* info = (client_info_s*)parm;5 S1 v5 H. U6 X( B* Q4 K: K
  9.     u8* rec_data = sys_malloc(1500);
    ! G/ j% I; M- a" V1 m" [2 g
  10. $ p/ z$ v) P  p: s. G% q1 h, `
  11.     WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id, 4 f4 T6 R4 p4 s+ W: X
  12.         inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
    , P4 V9 ^7 N" H

  13. % }3 C& M0 W3 s  u9 @5 p. X2 r
  14.     while(1) {& @0 M! {  {5 E7 v0 e
  15.         s32 ret = read(info->id, rec_data, 1500);
    # t6 r+ U( s5 v  n% N  w) \: c
  16. 9 d+ y5 P4 b( Q2 ]8 G1 [+ _; D) p
  17.         if(ret > 0) {
    5 p. w7 w0 ]& B/ J* U6 d% ^: X
  18.             WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);0 C/ M# m5 e# `1 e/ c% l8 d
  19.             ret = write(info->id, rec_data, ret);. K* f4 k8 j5 q$ m

  20. ! Z( W+ a7 f1 L7 L
  21.             if(ret <  0) {
    * R. B; t1 w8 S+ h' `
  22.                 WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id,
    ! N: ?8 K, J( c9 E1 G  E
  23.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
    4 m- O$ i7 N* f3 e0 x* M
  24.                 sys_free(rec_data);
    * r, o2 v# S. Z; b8 |" C# I! p+ i
  25.                 osThreadExit();6 u7 Q6 V  {( R: e! v& w- Z2 W
  26.             }
    $ a5 h0 j" q0 R+ y. i! q7 V
  27.         } else if(ret < 0 ) {
    - j8 L  g1 [: \  L! f+ l
  28.             WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id, % b8 q# T+ Y% m. y& `5 b
  29.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
    , u+ [/ K2 S# J+ e  x! @
  30.             close(info->id);
    : ?- U; d1 `2 e5 \
  31.             sys_free(rec_data);) N+ Z/ J. m3 a7 @" y1 o
  32.             osThreadExit();
    ! ~' [+ Y* d/ }" \6 D
  33.         }            ( D4 M+ d* t1 Q
  34.     }
    4 x8 T. }0 ?3 i; x  C: v2 T) N6 m
  35. }/ `& J) H& M' k- K% C$ l7 b

  36. # e" u) ~7 ~$ x
  37. typedef struct {
      \+ x  j" H! E9 v- |5 U2 @( _( r, w: x
  38.     u16 port;3 R0 N+ w& V  U* B# V2 C# x, y3 J
  39.     u8 cnt;3 a* U  m" g. h
  40.     u8 rvd;
    ! y" Q& \. U: w7 R3 N
  41. } server_parm_s;5 p# h" X9 }+ u6 w& T5 P4 ?1 T+ |
  42. 2 {5 B4 M0 T# t$ I2 Y. n
  43. void create_tcp_task(void* pram) {$ [% L8 Q# I" w
  44.     server_parm_s parm;4 ?! @$ W7 K9 |" ~$ I0 |
  45.     memcpy(&parm, &pram, 4);
    ; P" `& {0 u0 I+ F, Y# r0 v, j, X
  46.     WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);- r8 |4 ~) M4 m: q# z( o1 Q+ {
  47.     int listenfd, connfd; * T8 Z- C1 j* t3 J6 y
  48.     struct sockaddr_in servaddr; * L  L- Q# q" r0 q9 S
  49.     struct sockaddr client_addr;, Q+ }4 @) Y& ]  L/ O' E5 b
  50. 4 C# v# C4 t2 q+ w! `6 [
  51.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ), G+ o. g* y" \$ Y& @" k9 a
  52.     {
    # Q, h1 e; _  G3 i. R- ~4 G
  53.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
    % d5 o5 Y. r2 p$ y
  54.         while(1);) ]  F) |* I6 M2 T& J7 Q8 Y
  55.     } $ {( v, \1 b$ I: B! V
  56.     memset(&servaddr, 0, sizeof(servaddr));
    - i. z3 ~9 Y; K2 q4 P: E+ Q
  57.     servaddr.sin_family = AF_INET;
    6 {! d+ F# g7 a1 V6 ?. x
  58.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);             2 [# l$ |* {. n2 Z( J4 w$ |4 D8 D
  59.     servaddr.sin_port = htons(parm.port);
    ! b' J7 {. K1 V

  60. ; i* t" H* @9 Z
  61.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
    ! y! G! Y) l" E+ k& C2 [
  62.     { 9 C* O7 M( W( Y( B
  63.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);) P% U* {4 L4 e. F' ~- ^: [; C
  64.         while(1);" e) V! H( D  q5 x
  65.     } , u8 o7 v/ P- J; W
  66. $ j1 G& g' a5 U$ e. y3 R
  67.     if( listen(listenfd, parm.cnt) == -1)
    & F$ t7 c% v8 c% O* L8 s
  68.     {   [: V/ r+ u1 y) R
  69.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
      }+ t7 A- k6 n
  70.     } % r, `5 w" Y" z0 v) N+ `

  71. , u9 I. T# U/ E2 A: G
  72.     while(1). c+ w# D3 q0 b6 Q* w; L! N; Q
  73.     { " }. L! N& w# ^9 z+ E" S
  74.         socklen_t socklen = sizeof(client_addr);
    ' g# Y9 I5 K! ^2 i; }* f* s5 G
  75.         memset(&client_addr, 0, sizeof(client_addr));
    ; V$ ~- X: H. g3 d9 u4 p7 e- o
  76.         if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)
    / u- g& j' g/ W% b- y
  77.         { * ?5 F! P- A: D3 \0 k3 k+ T- d& u/ W
  78.             WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno); 0 \6 \; `9 B0 t* R
  79.             continue; $ B' E+ U% H$ t" Z* r
  80.         }/ I5 x" j0 V0 i( t/ U- K2 ]
  81. 9 T, b6 Y& ~! q; |" v
  82.         client_info_s* client = sys_malloc(sizeof(client_info_s));0 v% ?- X' |5 M  J+ i
  83. $ p# \$ u+ b. k" R
  84.         if(client) {
    ' }* z" Y8 q% {4 a* n7 z. h
  85.             client->client_info = *(struct sockaddr_in*)&client_addr;- k2 o6 A& o% u5 h0 Z  }
  86.             client->id = connfd;
    ( W6 H* o/ L: c% k5 _1 h5 H9 F8 a
  87.             client->port = parm.port;6 V( R# e6 K! w. p1 x( y% y. J& {0 M
  88.             osThreadNew(client_proc,(void*)client, NULL);( C+ w, Y1 f9 g
  89.         }
    ! G4 l# E7 Y7 e$ K3 ~! r! q

  90. # L3 E9 ?$ \8 O5 u/ g! P
  91.     }
    0 y' t- L5 t8 Y: M3 `- W
  92. }% @* Y( o) |2 ]: Y
  93.   B' ^9 B- l1 B+ E
  94. void create_tcp_server(u16 port, u16 cnt){
    2 ~( R* k6 p/ b3 Z7 p
  95.     server_parm_s parm;
    " L' {7 {; i  M
  96.     parm.port = port;, ?; L5 a1 \0 a/ e$ Q4 E
  97.     parm.cnt = cnt;
    4 K9 |% {( F  c- F
  98.     u32* ptr =(u32*)&parm;
    - S4 c9 C9 {8 U- _- s
  99.    osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL);
    - d/ Y7 S4 t  D. @2 h$ a4 L8 c/ I- p
  100. }
复制代码
7 a7 C+ U% |) C1 @, A; \; R
非阻塞方式:
" ]1 J2 e# Q  b! @3 h$ V5 K
7 g0 z" p5 e. K  X0 y5 X
  1. void trace_task(void *argument) {
    7 T2 S* Y1 J1 a* t9 S  C- b
  2.     const TickType_t xBlockTime = pdMS_TO_TICKS(50);  ]$ w8 r' ^: e% k4 I
  3.     u8* read_buf = malloc(128);; K9 i- p$ X# o7 t  @
  4.     WDBG("TCP SEVER port:%d", 1234);
    % _1 S5 c0 @: N
  5.     int listenfd = -1;
    5 R9 }; U" x9 }( Y
  6.     int connfd = -1; ' D+ J# j" M7 W  N7 q# e
  7.     struct sockaddr_in servaddr; + w" D; v" Y  N
  8.     struct sockaddr_in client_addr;$ h4 s2 u% r% B# U; T  N3 u  |
  9. ) g/ q) G9 A( L8 [% J5 Y4 K/ _
  10.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )# K- P- z1 s: z4 j# b; O+ @
  11.     { " l, `+ g: h/ C, l2 p
  12.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);& H- _* J, P, n( ]$ q/ W% A9 I
  13.         while(1);
    ' |9 V1 v& B% ?$ B
  14.     } ) z- P. _2 W- L- Z: m: |$ A
  15.     memset(&servaddr, 0, sizeof(servaddr));
    1 a$ [0 h' |+ C# z/ s
  16.     servaddr.sin_family = AF_INET;
    % l2 A/ p. p+ N2 S2 v& u
  17.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);            
    - o3 V% ]( r3 R4 v
  18.     servaddr.sin_port = htons(1234); 6 b5 n$ ?8 N$ g4 l3 I! p
  19. & T! P& V$ m& u
  20.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)/ }0 _4 o4 T$ \; Y( b7 v2 t  f6 O
  21.     {
    5 O- F# T3 o; a7 }5 x, y: [
  22.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
    / J0 q6 u- z- l+ c0 X6 Q  i
  23.         while(1);
    ( n0 S  H% \: _0 a- u2 T" n
  24.     } / c; v) \  j' ~5 |% J8 s
  25. + f4 \$ c- v& x7 i9 x
  26.     if( listen(listenfd, 3) == -1). _" D, n  F$ I
  27.     {
    ' K: A# y1 A+ J. Z& K  e& e7 }
  28.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
    1 y- ?9 N( e% V3 f4 U8 q
  29.     } 1 M1 u7 a+ d: N3 v+ S, @
  30. 0 M9 ~( e! i6 R7 W
  31.     {
    + p- x' S9 \# D2 j. q
  32.         DWORD nMode = 1;
    0 [4 n/ V1 x! T& I4 ]# J0 Q! g
  33.         ioctlsocket( listenfd, FIONBIO, &nMode );        
      s& Z  Q* R9 D
  34.     }
    $ c' X% |- s, \7 L
  35. - I( d  z* ^' {) ]" v' S0 |
  36.     fd_set fdRead;
    ; {2 u7 ~" Z$ b* v, ^# `; A
  37.     fd_set fd_err; 0 N) C# W/ E( e: A+ v
  38.     struct timeval tv;
    - Z. Q( L0 P8 P3 ?* v6 J
  39.     socklen_t socklen = sizeof(client_addr);  w& Y& Q7 e% ^/ t6 {7 f7 X6 {
  40.     memset(&client_addr, 0, sizeof(client_addr));) r( K# w8 @7 d  s6 X

  41. 8 H- @% h: [8 d% i: Q; d. [
  42.     while(1) {
    9 L  W( ?8 ~0 P( E( ]( b
  43.         FD_ZERO(&fdRead);
    . C: E! t5 e+ u8 e3 Z9 \+ W
  44.         FD_ZERO(&fd_err);  $ R/ t1 R: [! W% V  l
  45.         FD_SET( listenfd, &fdRead); 3 j& y+ H( f; o6 R* [; C
  46.         u8 cnt = 2;
    / V) G7 f! C3 }9 _' H
  47.         if(connfd != -1) {
    3 B) `/ b6 a+ ]" ?; v; k( y
  48.             cnt++;
    : u1 G" f: x8 ]; V! ^
  49.             FD_SET(connfd, &fdRead); " h/ ^* x! D) w
  50.             FD_SET(connfd, &fd_err);
    : L9 c) Q; g8 R5 U
  51.         }3 n) F2 X) M0 I) k# m4 e" ]6 A

  52. 9 B4 E3 I0 o! G9 N# b9 L, [1 V6 M0 i* E5 D, N
  53.         if(connfd != -1) {0 r+ F: @2 d0 ~9 o1 k: E
  54.             u32 rec_size = xStreamBufferReceive( g_trace_handle,
    ( [. |& Z6 _( I* K5 B" F
  55.                     ( void * ) read_buf, 128, xBlockTime);
    " E: r& I# Z% i1 Z! L
  56.             if(rec_size) {
    # s' n; ?& m: f1 T& X: t% @7 t
  57.                 s32 ret = send(connfd, read_buf, rec_size, 0);0 L" Q, B3 K# u# D5 V
  58. ' K% u% H  X& Q+ N* l! `3 a" \3 y$ z& h
  59.                 if(ret <  0)  {' ], J" n) ^) ~5 S* D+ {$ [. @
  60.                     closesocket(connfd);
    , P; w9 i2 y/ a( ~9 W
  61.                     connfd = -1;
    # Q# c; l* I- |6 m; h& ]) z* h
  62.                     continue;$ k2 U) ]- T) m; J* D; ]6 T: d
  63.                 }. e2 R: n3 |9 s! }- d( t
  64.             }
    ; h2 y( {7 M( }  i# B4 Y1 N
  65. 1 T* f' e# F9 a# N9 T/ A# D
  66.         }4 \6 p0 c# h% S

  67. 7 p7 Y; R$ w  `, |8 k$ J
  68.         tv.tv_sec  = 0;
    4 H( f( Q3 g: Z8 U$ g% i; ?
  69.         tv.tv_usec = 20000;+ N/ Q# O- L# M( `
  70.         s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);) b5 ]9 I8 q, ~# \& Y5 J
  71. 3 I5 F* K7 w' e( L4 p  @; r# Z
  72.         if(ret == 0) {+ {( T6 V) j" F, O( w5 F

  73.   @' E% S/ P/ A/ v8 _* y! ?8 M
  74.             continue;% P, w8 x* m$ x9 z
  75.         }2 i9 M- Z- B5 q8 B

  76. 1 a# G* a1 B, x; t! Y: m/ N* @1 H
  77.         if(ret > 0) {
    5 J& b/ B' C6 p6 `
  78.             if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
    # {' |; W* Q  j' Q9 K
  79.                 connfd = -1;
    : @# E) g! V' p! o) F7 `4 s1 }; O
  80.                 continue;! @+ d5 R" h+ @% T6 ?4 y
  81.             } 7 G' S8 [5 U  d5 M" g& L

  82. - H8 Z0 ]+ b, ^0 t. ~) u  D1 }
  83.             if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.
    2 N3 ]: ], P2 z% H
  84.                 ret = recv(connfd, read_buf, 128, 0); 5 f; o$ k3 @. P0 V5 F
  85.                 if(ret < 0) {
    8 |" S) z3 I) ~
  86.                     closesocket(connfd);
    9 D4 t* R% ]2 X6 w# L) r
  87.                     connfd = -1;
    5 B4 G6 `. i) Q$ C: A0 \5 U; w
  88.                     continue;& o, C. |& Z4 n4 g( V
  89.                 } else if(ret >0) {% ^" ^2 v- b# H& e5 u
  90.                     WDBG("rec size:%d", ret);3 y; E2 Y% S2 t- `- N& [# G" S9 X
  91.                 }5 [* S/ \8 K$ Z0 C
  92.             }   : ~' W+ t7 c; P- @7 D; ~
  93. - N1 g+ j3 V2 Y6 F7 n' G: l
  94.             if(FD_ISSET(listenfd, &fdRead)) {
    4 c+ P) h2 ?$ J- U$ k' u
  95.                 s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);( Z% w' r! ^8 w( V$ N7 r! c
  96.                 // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); ( _4 C/ T; P& f# I* F3 `2 I5 W
  97. 4 ^3 C5 d/ H* G+ C- l
  98.                 if(connfd == -1) {; M& |; q7 S# i% W% _# ?
  99.                     connfd = temp;
    5 k" S* V; T' v
  100.                 } else {& L$ o# F' h5 P) Z. f% X5 a
  101.                     closesocket(temp);
    9 s4 ~! P$ h; q# W9 U5 q& q- Y' f
  102.                 }
    % i# @' w) n- {2 ?/ f* N
  103.             }        
    ! ]' R7 c1 v" W% ]  g- J# m
  104.         }
    ' r& K& \; V" B6 s2 f
  105.     } 3 R4 M1 o) ^& N/ V7 o: J
  106.     #endif' |- N6 O# f! e, \5 `/ c- i* ~
  107. }8 O% e: h& d2 _/ Q

  108. , k% \1 l8 r4 J9 v, t
复制代码
2 b$ D* f7 q6 @  F+ ^9 _
收藏 评论0 发布时间:2021-12-13 22:35

举报

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