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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:35
STM32F7 LWIP socket 创建TCP server
6 [% x. `, r# B/ o) J5 g+ l9 |
  1. **阻塞方式:**
复制代码
  1. typedef struct {4 f- T# y0 |( L( A6 {7 R
  2.     struct sockaddr_in client_info;, m/ N& j3 G7 T% u- t  ^# G+ B
  3.     s32 id;
    6 }; u/ T) N" O, b
  4.     u16 port;
    2 I! O0 O) I- t9 y, G% e2 a
  5. } client_info_s;
    ! _1 f. Z% u# E2 V+ |" {
  6. : K$ F, f" q2 a
  7. void client_proc(void* parm) {3 j: C1 J3 L/ P  T4 I* W/ B8 C" s
  8.     client_info_s* info = (client_info_s*)parm;  Q9 ]. d, ]  L* q$ {! B5 i. r
  9.     u8* rec_data = sys_malloc(1500);. r; k- V0 q: l* E0 Q

  10. 0 v* M3 A" G$ Y6 `& A) p9 B
  11.     WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id, 0 u. x. t* l$ ^' \: g4 a$ E0 P
  12.         inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);( y; [. a1 Q4 T
  13. 4 O+ y$ ~+ i$ g8 D+ v" S
  14.     while(1) {
    6 I' I) z% S, n' `. `9 h
  15.         s32 ret = read(info->id, rec_data, 1500);
    / R1 @+ z" g- s6 U+ X0 r' z

  16. # N7 g! e7 R: B8 I
  17.         if(ret > 0) {
    ( `: d' o) Z3 o+ q
  18.             WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);: F" j* N. q, Z' G
  19.             ret = write(info->id, rec_data, ret);( i5 x) K' k, z, h
  20. # M8 Q) M7 L, J/ r
  21.             if(ret <  0) {
    & ^. s4 J3 T3 p  }; V% x/ r
  22.                 WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id, ! E9 w& ~( C- s7 O
  23.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);) c2 w/ ^5 c3 A/ W7 e1 d
  24.                 sys_free(rec_data);" c0 ^9 I; w9 w/ ^9 \+ ~
  25.                 osThreadExit();- a9 j5 r& n8 c* s
  26.             }6 N& x/ b  e# m( h  B# x
  27.         } else if(ret < 0 ) {2 u6 C6 `( z" r, y; [8 `0 ~
  28.             WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id, 1 h, x/ c. k  h
  29.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);# O; c5 l1 V4 Z+ e
  30.             close(info->id);+ T3 a: _9 Y# V6 G$ P5 D. b/ s
  31.             sys_free(rec_data);, ?( f2 x9 D2 h5 x! v) V0 A
  32.             osThreadExit();
    3 U; I' D) @! L
  33.         }            
    ' G4 ~- u# \) k5 ?
  34.     }( U4 G3 Q6 V. x" f8 c
  35. }6 H, {# N# ^+ Y
  36. + }/ F/ ~' i5 R0 V1 H" ?9 H
  37. typedef struct {/ h* a& S' s- d) V6 N5 P, h
  38.     u16 port;' s4 R, E( _+ b5 z; ?
  39.     u8 cnt;" @. ~& c4 n8 E: R
  40.     u8 rvd;
    2 }. [' p' R! z. l. ?5 ~4 o8 j* K, s
  41. } server_parm_s;
    / v  k1 T! m( W- y" {& a* j$ i

  42. : v8 j( t; |% r( {, b
  43. void create_tcp_task(void* pram) {+ d; p: }/ m* \) x! W: y
  44.     server_parm_s parm;$ r" i% ~! X5 j0 h8 [, D9 y5 I
  45.     memcpy(&parm, &pram, 4);
    / u1 B, G# p8 I" W# C7 f4 a6 ?
  46.     WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);& J6 V% v  w2 `$ t
  47.     int listenfd, connfd; # {$ o6 e* d) H1 B6 t- H0 P
  48.     struct sockaddr_in servaddr;
    9 Q, F- H( A  Z
  49.     struct sockaddr client_addr;
    , O1 s9 k! j4 d; v% P! w
  50. 8 ?! d: `+ j& y% z  M- f
  51.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )# P) W6 J# W- ]; Y  m2 O! g; L
  52.     { - V4 k2 |/ O1 @0 y) Q: v
  53.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
    - l4 Z: j9 f" n  Q+ v
  54.         while(1);5 c; `8 i8 P/ J- a7 X4 L3 L
  55.     }
    + g3 d$ b( c  O! V: I& l
  56.     memset(&servaddr, 0, sizeof(servaddr)); 6 ^' A% _. ]3 }
  57.     servaddr.sin_family = AF_INET;
    * |9 [9 w9 N: h+ O: ]5 w3 B
  58.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);            
    * ]" {6 n! _! n, K6 `4 l
  59.     servaddr.sin_port = htons(parm.port); 6 @. O$ N0 z5 C$ o. J$ c* j& Y/ @

  60. 7 H! v1 x0 y& o9 P  E, T* ^
  61.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)- e6 W& x* x# C& W5 g
  62.     {
    - e: ]) }3 v0 v
  63.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);2 Q6 H  i: {& o$ O( P9 @
  64.         while(1);6 i5 f% i3 C* g% X. x% l
  65.     }
    * x2 i8 F: n2 ~
  66. * n- F5 x* K8 i+ b  `2 k9 p
  67.     if( listen(listenfd, parm.cnt) == -1)8 _$ ^& p7 `/ ?/ [  c
  68.     { 6 f, }" |& l& e6 u4 C
  69.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
    ; l- D% a8 W# k" H9 i6 i. X
  70.     } - L" j0 P3 v. P7 o
  71. 8 a6 g9 [+ A4 P" L7 N' d9 Q. k' G
  72.     while(1)0 e5 T1 G2 Y2 n* g; ?
  73.     {
    3 u2 \! R4 k7 F4 q
  74.         socklen_t socklen = sizeof(client_addr);, n1 X" i) S- b
  75.         memset(&client_addr, 0, sizeof(client_addr));; a  }) @6 Q+ }! p. }- j. m
  76.         if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)
    ' G" B$ ?( {0 O
  77.         { 7 k* w6 Y; P6 M9 `6 A' n6 \6 K
  78.             WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno); 3 W. `. K; C  c1 m
  79.             continue;
    8 I) k# ?: B# N1 }6 e0 ]2 \, b
  80.         }7 e, ^6 r" }5 v8 s& }, V4 j4 W
  81. ' s4 l* ~& u3 Z4 F7 R3 }& R" D
  82.         client_info_s* client = sys_malloc(sizeof(client_info_s));
    $ ~3 ~0 x! m2 h1 D7 j9 k& }

  83. . E2 R4 t: E& V
  84.         if(client) {
    6 e  B) t6 F3 N  {3 `
  85.             client->client_info = *(struct sockaddr_in*)&client_addr;
    4 V9 G4 \3 a0 K9 }6 j& c
  86.             client->id = connfd;) @' D& h- [( L" R* d0 I
  87.             client->port = parm.port;
      G) B5 {7 s4 `  L# n; D
  88.             osThreadNew(client_proc,(void*)client, NULL);
    $ E$ z! T9 q$ G0 [
  89.         }+ Q5 @$ z' `- S- Y& f. g
  90. " l$ L9 i! ^2 c. h
  91.     }
    ' D$ F  d/ Z6 y( e9 C
  92. }
    ' I, i8 B* c# v

  93. $ x( e! n% j4 N" A  i
  94. void create_tcp_server(u16 port, u16 cnt){8 j7 X; T$ D. @: D; l
  95.     server_parm_s parm;
    6 X+ H( C. a2 U& E% B; @
  96.     parm.port = port;
    8 v) _3 i' N6 Q! e
  97.     parm.cnt = cnt;
    ) p  I6 |6 e( x/ i& L( z. `
  98.     u32* ptr =(u32*)&parm;0 m3 V6 }: G1 [; E/ v6 v7 Y
  99.    osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL);
    ; N, T" f$ K1 Z! g
  100. }
复制代码
% C  Z% J; e0 E. @' M" ]9 l
非阻塞方式:
1 ~- |' y2 l- Q4 X8 N
. y- b: a3 B: ~$ j6 r" H
  1. void trace_task(void *argument) {( S9 b5 V6 L4 F, P: G1 h% l
  2.     const TickType_t xBlockTime = pdMS_TO_TICKS(50);* y1 j) q- [! G" ?; |
  3.     u8* read_buf = malloc(128);# [* J: M8 `! V1 z! w$ n5 k, Y
  4.     WDBG("TCP SEVER port:%d", 1234);
    , w) N& R; u" K# `
  5.     int listenfd = -1;# r) e& \# a/ k% s8 J
  6.     int connfd = -1;
    # I% \1 |" s5 V8 q" P) A
  7.     struct sockaddr_in servaddr;
    , w$ o7 u/ g5 P/ T0 z4 R
  8.     struct sockaddr_in client_addr;
    ( O. b/ l. P8 s0 T% K9 r4 q: \2 Q0 A# M
  9.   W9 Q2 j4 z) }$ b+ Q
  10.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
    $ n+ u3 w- D# s
  11.     {
    1 D; h- K" l: z5 Q, D/ R8 E( I
  12.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);4 O$ a: M/ c* B$ ?
  13.         while(1);
    7 v! _# I- I' \7 a, x; N
  14.     }   B, o; G* q3 v0 `# a, ?* a' e5 b
  15.     memset(&servaddr, 0, sizeof(servaddr)); ( K4 ?0 p8 I3 N8 y" b5 d- v
  16.     servaddr.sin_family = AF_INET; : F; X, `; I  E0 i
  17.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);             9 {& H; z# j7 |, B' F- v- y% Y1 X
  18.     servaddr.sin_port = htons(1234);
    . L# ?0 h6 ~* X) H
  19. ; m; e4 @& o, U8 n; Q! v
  20.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
    4 U( O7 \0 H; B7 k0 Y/ z( t; N
  21.     {
    , d1 b% _: k( l6 Q* v8 B- N( t
  22.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);! t! N7 }1 J. U' G
  23.         while(1);
    1 Q) u" F# E. d8 P( c+ Y
  24.     }
    ; ^9 I* a6 G0 O! f& S' l! m9 ^
  25. 5 X2 X- j. A& C! h% ?( X# g
  26.     if( listen(listenfd, 3) == -1)
    ( ^4 Q% X3 T4 b
  27.     {
    ( {% z! g+ D! i! Y
  28.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
    ( z6 P1 n/ A  Z; h4 |) Q5 N
  29.     } * x! r; v' p, t3 v* I, F! b, G# I- P

  30. ( V' k5 ?! D/ J( v3 A
  31.     {
    8 Z" i' i0 E: y1 X" K$ N9 `3 u
  32.         DWORD nMode = 1; * Y' ?! d% R$ i( G8 R& }% o4 G
  33.         ioctlsocket( listenfd, FIONBIO, &nMode );        
    8 s6 X% I; `7 M8 V; Z
  34.     }1 N! c( v1 j- p
  35. 3 G0 l. M- r6 L: C
  36.     fd_set fdRead; + ^3 G( u! n3 k6 d& g! Z) ^
  37.     fd_set fd_err;
    8 a0 J, [; Q" d6 D+ p
  38.     struct timeval tv;
    $ S5 q" S4 k* k% B" M7 \
  39.     socklen_t socklen = sizeof(client_addr);
    6 a3 N; e3 }1 K* Y' }0 m" n
  40.     memset(&client_addr, 0, sizeof(client_addr));$ t( \+ V4 F8 f3 @; }1 M
  41. 4 o4 X/ ]$ D7 g, g+ v; o
  42.     while(1) { ) d/ V5 H7 P% f- \  w
  43.         FD_ZERO(&fdRead);
    $ X$ t: u) X, \4 \/ u7 X
  44.         FD_ZERO(&fd_err);  $ d8 t) I8 a# \( }" @0 F; s- V
  45.         FD_SET( listenfd, &fdRead); ) m6 k+ A! d# w, Z$ `
  46.         u8 cnt = 2;
    2 u8 K$ R( k. j+ c) i6 O
  47.         if(connfd != -1) {
    . k# S0 g. X+ r% k+ ^1 V  q1 M/ n
  48.             cnt++;
    4 \3 T9 h0 ]0 S0 V
  49.             FD_SET(connfd, &fdRead); # p9 ~% |8 z" u/ o
  50.             FD_SET(connfd, &fd_err);9 P, L9 }2 p# D& _" W0 w1 i8 r
  51.         }
    . p& Q2 H- L! w. |- y/ _/ H
  52. ! M2 o' Y: O8 p4 D9 M5 Z3 H% x7 s
  53.         if(connfd != -1) {
    # B1 S' x+ S- a+ h# x& ?8 V# m) j
  54.             u32 rec_size = xStreamBufferReceive( g_trace_handle,
    6 t3 a9 x: U( O0 n
  55.                     ( void * ) read_buf, 128, xBlockTime);& O: h+ D& V/ a/ i6 \1 U0 a
  56.             if(rec_size) {
    7 s6 j8 X( x8 R/ ~4 s! j
  57.                 s32 ret = send(connfd, read_buf, rec_size, 0);
    ! D8 B7 L+ w2 N7 {7 ?2 h9 L
  58. # g- N; l, R+ p+ o# F. [
  59.                 if(ret <  0)  {. ]( ^/ ^) |! V: h9 u! C
  60.                     closesocket(connfd);
    * z5 i8 ]. ?& W
  61.                     connfd = -1;3 O8 z& E/ e* F& N
  62.                     continue;5 F, J8 }& u4 u( w  S
  63.                 }
      V0 n% Q6 \8 `
  64.             }
    % o1 o/ u" O2 R# f

  65. : X% v) x& w) p. `% k& [
  66.         }( T8 _& Z7 a, {+ ?
  67. + c# y/ A3 I4 d' J  u5 `6 }
  68.         tv.tv_sec  = 0;
    9 Y% q5 B2 X! p8 q! ^
  69.         tv.tv_usec = 20000;
    ( n. W9 ?3 d6 |) ?
  70.         s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);' `$ i* L1 }9 O) C3 F: m
  71. & k" k  H) h, J1 c; D& q: D
  72.         if(ret == 0) {' l% S* P1 p, X# d% P* P4 m" H

  73. 9 F# @& q" M7 Y: c
  74.             continue;% k% C5 p' R! l2 \
  75.         }% k- v3 S2 y9 S% S4 D) r
  76. / N% t: [) C* R5 R) Q( A+ I
  77.         if(ret > 0) {
    1 ]/ M' n7 j) F& J3 |" h! U
  78.             if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
    0 E& v; [& U, n) ?1 L
  79.                 connfd = -1;
    * j1 B: e" H" _
  80.                 continue;, i& v0 Y: @# k+ D/ g
  81.             }
    8 g5 I( H  g. c. V  K0 l4 k

  82. * K& N8 C; S; w' q) ^% ~
  83.             if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.
    ! g& w& C  f5 j! X2 k% q" C! Z# [5 I
  84.                 ret = recv(connfd, read_buf, 128, 0); ; t6 y7 f; Q0 m+ Q, m
  85.                 if(ret < 0) {
    - G6 L5 T$ H9 O/ g% |4 T( }
  86.                     closesocket(connfd);- Q- m7 k7 N1 `/ L
  87.                     connfd = -1;: X8 H, S# U/ y0 c. H9 x3 `' ], s
  88.                     continue;
    + o1 T: W! N. j
  89.                 } else if(ret >0) {
    . [" y$ t4 U; ~. g9 r2 {# _, `; t, }
  90.                     WDBG("rec size:%d", ret);8 [, Y/ f6 e, ~. U' C; Q
  91.                 }) j: ]6 F2 \) Y& `0 |: s" l
  92.             }   
    ; M; W3 @( O7 J) p/ L

  93. * q7 Y) d' O5 G/ O3 v1 Z
  94.             if(FD_ISSET(listenfd, &fdRead)) {# u5 _9 h" }! ~. B' Q8 E
  95.                 s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);" A* T, a& y7 n# O
  96.                 // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); 8 z4 ?) ]9 u# G3 E

  97. 7 p/ Q8 a# x9 O! h; x9 q4 a
  98.                 if(connfd == -1) {
    # Q1 X- H3 D+ ^* h* z
  99.                     connfd = temp;  b1 b. {: }8 d
  100.                 } else {
    7 `7 N' s+ U" S, ^# B8 E) ]
  101.                     closesocket(temp);* I/ Y. d) X$ g! w* X
  102.                 }
    * O' }/ j- b5 v
  103.             }        8 o# z. O; Q$ [8 w/ ?, H! x
  104.         }* B# {% p, ?9 x1 j+ h
  105.     } 4 Q: H6 _' w! z' c3 |5 F
  106.     #endif
      o+ e7 `0 D0 }: X. D
  107. }
      h! T0 N8 Z/ D$ B1 H2 Q1 b

  108. 6 h  d! Z" B, ]+ _
复制代码
4 \, V) ?2 s: q8 z6 \6 N, e
收藏 评论0 发布时间:2021-12-13 22:35

举报

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