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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:35
STM32F7 LWIP socket 创建TCP server& Z( l$ ?' W' f2 _# s; q6 z0 [9 Q
  1. **阻塞方式:**
复制代码
  1. typedef struct {
    + s9 |1 O1 k$ E) Q2 p' m" C( j
  2.     struct sockaddr_in client_info;
    ; }# s3 H4 p% J) F& b& E
  3.     s32 id;
    ; n% W+ i( l8 z0 c, ~
  4.     u16 port;" J* |( y% r8 _7 m) f
  5. } client_info_s;
    5 V3 X, F/ o3 ]
  6. / O+ x) p2 _* J# W
  7. void client_proc(void* parm) {8 q# n4 X( g+ D- m. S! J
  8.     client_info_s* info = (client_info_s*)parm;) f. i+ F6 Q, c- W9 c' k* C
  9.     u8* rec_data = sys_malloc(1500);+ z& C  L( `, E8 Q. W. L" v

  10. % \0 \; y' `- H! c
  11.     WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id, + y/ Q7 B. W4 e& P9 h7 B$ X& i
  12.         inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);8 x. E$ F$ p4 s$ y6 _

  13. 7 r/ Z. G+ W/ w+ ~
  14.     while(1) {4 j2 R% y- R8 q' h
  15.         s32 ret = read(info->id, rec_data, 1500);* P# h* u: P  K, @. |

  16. + Y! [+ Q1 r2 X6 R' }$ Y
  17.         if(ret > 0) {
    ! d: {0 D4 k0 ~; e
  18.             WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);$ ^: S6 X* P) G! y! D
  19.             ret = write(info->id, rec_data, ret);9 s$ }9 \# B! E/ Q, `6 F

  20. : K# q+ ^& s; M* S) F/ K
  21.             if(ret <  0) {
    - M# `# ^) T: z" \' z
  22.                 WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id,
    . W1 d& C& ?9 k/ ~
  23.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);# R4 K6 o, N  h
  24.                 sys_free(rec_data);9 i, H" S" p3 m' J% f- H
  25.                 osThreadExit();
    9 u7 I1 [5 |5 c- |) i5 o
  26.             }4 Y% ], \0 k- {; C' T* |4 g: |$ r
  27.         } else if(ret < 0 ) {
    3 g7 _! o+ K4 W3 [- y
  28.             WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id,   {: G, Z  }# ~7 U
  29.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);8 Y" v0 f5 E: `2 K6 ^
  30.             close(info->id);
    6 Y- x- ~5 c$ r" v8 \
  31.             sys_free(rec_data);
    & e0 x  G. Q/ @, w& h9 }: h
  32.             osThreadExit();/ Y7 e0 Y9 b* V' @7 O$ s2 T( k( Z% k
  33.         }            
    . a* Z% [/ \* ^& E7 p: Z
  34.     }
    / _7 K; i" _! O: C* ]
  35. }9 G. i7 d6 o+ f
  36. - v( f3 |: ~. s2 g% x* b7 h4 u
  37. typedef struct {/ ]# u  O+ K2 h' n* p
  38.     u16 port;
    ( C: R. M+ a: a. X3 X. n. O" d
  39.     u8 cnt;4 W: M0 d( r: Q  H6 ]! W
  40.     u8 rvd;) e& H0 |8 H+ c/ z" B3 S5 O
  41. } server_parm_s;, A7 n! z6 G2 i% j5 x5 ~
  42. - V" {5 k, ]7 x. J4 ~. Y) _8 T
  43. void create_tcp_task(void* pram) {, ]' Z7 w4 c" p# e/ V
  44.     server_parm_s parm;
    6 N0 q) m% Y) p) h" q( H$ Z
  45.     memcpy(&parm, &pram, 4);
    * B' j/ Z  h" ]
  46.     WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);
    , U3 X9 R3 f% i& T9 P, [
  47.     int listenfd, connfd;
    - R" ^! w5 m  x
  48.     struct sockaddr_in servaddr; ' y. J& j* ~8 D( ~
  49.     struct sockaddr client_addr;
    3 o. S/ ]4 r! l1 x5 w

  50. 3 R" E) ?% r  E+ A0 r0 g9 E& V0 M
  51.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
    ! `6 A8 r9 d! ~) y2 T1 N6 I$ e
  52.     { 6 E0 Y. R' p% l# ~. `6 r
  53.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);2 y* U0 s! E4 p2 d
  54.         while(1);# N7 L7 x! w# z4 F- x
  55.     } 0 A' T7 X% s2 i6 ^$ b0 C* w
  56.     memset(&servaddr, 0, sizeof(servaddr));
    , M* M; o$ o1 u/ M( v
  57.     servaddr.sin_family = AF_INET;
    & a: u( B- l! k
  58.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);            
    , G! h: b6 w/ _, G9 M
  59.     servaddr.sin_port = htons(parm.port); + c6 K+ @& y( ~) e
  60. ' P8 V$ i$ t- D# z
  61.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
    # }" }$ ^- B+ D7 m' H3 f' M  ]
  62.     { 8 {  K( A* o, s: m2 R
  63.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
    $ {' j- e1 u. U" k8 O! \! Z
  64.         while(1);6 g. ^! A6 y/ N- t$ d. i" p  s
  65.     } ; q& \9 X+ X& v8 T8 _

  66. + D4 t& ~5 O- s' F! i
  67.     if( listen(listenfd, parm.cnt) == -1)8 E& v' P8 q/ n0 ~7 Q. p  S
  68.     { * H7 J8 O( t8 j; ]
  69.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
    0 W# Z: N* o5 z! z- P9 t4 B
  70.     } ' _1 c* J" d& b- Y

  71. 6 s  D& T4 M- I3 ]+ L
  72.     while(1)# x3 k. o# V, ~" q
  73.     { . K! E) G. r% M0 d' q* x# x
  74.         socklen_t socklen = sizeof(client_addr);
    7 v! L$ v$ ?8 c. t0 u
  75.         memset(&client_addr, 0, sizeof(client_addr));& ]) d  K7 u7 `* S6 N
  76.         if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)4 [% h1 s  U) R+ x: H" K7 i( t
  77.         {
    ; p+ y7 A/ M- a: e
  78.             WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno);
    + D1 E  H5 l( v' v+ D1 m  v
  79.             continue; & k* X# W! }+ v, w
  80.         }0 p& t, C6 T. {' Q

  81. + ^  {! b& t. @1 u
  82.         client_info_s* client = sys_malloc(sizeof(client_info_s));" u/ \& Y5 b5 Y; X

  83. / x. d# `+ m( ^! r8 |4 h! e, B7 A$ `% v
  84.         if(client) {, k; q" W' |# z" w# u9 q
  85.             client->client_info = *(struct sockaddr_in*)&client_addr;
    3 K$ R: C% |; ?9 f+ q
  86.             client->id = connfd;
    ) n: [5 ~7 x8 v2 E5 _
  87.             client->port = parm.port;
    0 ?3 Y' b+ _3 d: V4 ?9 e& |' C
  88.             osThreadNew(client_proc,(void*)client, NULL);
    6 F; F+ b, e% b0 x) V* m
  89.         }. v, X$ k+ m6 d' c- j' ]
  90. ' c4 @) O2 |. y/ ~  C7 O
  91.     } $ |8 w* F+ o( \0 {' B
  92. }- A9 @% u; j. H# K3 m6 i( R
  93. * I& K& M& I6 k/ n5 |
  94. void create_tcp_server(u16 port, u16 cnt){
    7 X4 C$ H3 S0 i) x
  95.     server_parm_s parm;  S0 |  z/ @% q) @6 s' B' ~
  96.     parm.port = port;
    ' Y! O$ g5 o& h2 W; J, C- E$ k' o
  97.     parm.cnt = cnt;1 K* k! V  I* M; u& a1 q
  98.     u32* ptr =(u32*)&parm;
    : d2 A' D" N- D- N
  99.    osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL); ) F) T3 e$ W9 g$ B
  100. }
复制代码
6 Q- q5 @3 s* [/ a
非阻塞方式:1 x6 K/ P+ n/ h9 ]( c0 Q

2 t* i: g- ~9 H# s( O
  1. void trace_task(void *argument) {
      u8 I2 S3 O% ~) ~
  2.     const TickType_t xBlockTime = pdMS_TO_TICKS(50);7 R( l# t' Q4 r) v
  3.     u8* read_buf = malloc(128);9 x* a- W: n2 F9 m7 u5 L
  4.     WDBG("TCP SEVER port:%d", 1234);( f: m4 K# p/ b
  5.     int listenfd = -1;
    3 t! _% n2 |' a0 b  H
  6.     int connfd = -1;
    , @+ ]/ I7 ?% V& J* H
  7.     struct sockaddr_in servaddr; ) I$ U: a9 k6 N0 V- d* B% j+ f
  8.     struct sockaddr_in client_addr;
    , n: }9 F% u( u- D2 Q

  9. ! C7 y# _! M8 m/ Y& l4 ~! Z, h% T
  10.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )( L. ]8 _3 W( K0 Z$ Z& p' k" d
  11.     {
    + u( f5 B& T1 k. G
  12.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
    % D4 c1 g1 M7 h2 X
  13.         while(1);# y; o4 j" `1 m/ f/ u
  14.     }
    9 m$ l: S% F/ \0 j- S- z' h
  15.     memset(&servaddr, 0, sizeof(servaddr)); ) M3 G7 N3 i" @7 c, B" |- u
  16.     servaddr.sin_family = AF_INET;
    9 q+ R% T5 c$ P: q
  17.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);            
    : l) B$ G6 X& W; [- i+ u7 b3 k- l* K
  18.     servaddr.sin_port = htons(1234);
    . P, o! u$ f9 |. o
  19. ; ]6 P5 K- T' @( ~
  20.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)( w. }% \: D/ i. ?  c7 |' l/ W
  21.     { : X9 P- P3 Z; J! y) d# ^
  22.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
      B- ~. x3 X" r9 I4 e. N
  23.         while(1);
    $ k/ J. l. W9 T  X! U5 N
  24.     } 2 ~  V& W, M9 B9 A0 t5 z* B

  25. . S( B+ ^. G6 y: h& Q4 U
  26.     if( listen(listenfd, 3) == -1)
    % ?8 h. x. S7 ]" E3 J
  27.     {
    * m) `4 x% y* D2 X
  28.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
    2 q& s9 l; Q  t$ s; d6 C
  29.     } 8 x; v1 f- l8 ]$ H  k! }

  30. 7 Z- w% z: V1 A. w
  31.     {
    - D, X8 ~0 @6 I. R8 u1 I- Y
  32.         DWORD nMode = 1;
    2 B. a' |8 j+ l- \( n
  33.         ioctlsocket( listenfd, FIONBIO, &nMode );        - {. A# q' T) l' Y/ i) I2 @
  34.     }5 ]- n- r! x* {" P
  35. * j' w" v7 S: H' p
  36.     fd_set fdRead; - ?' `: `: V3 w( ~. Q: Y4 p
  37.     fd_set fd_err;
    # I5 S9 |; ?" Y: U' t
  38.     struct timeval tv;
    5 f. [; T5 @8 g5 w0 Y1 h& U' Y
  39.     socklen_t socklen = sizeof(client_addr);
    * |# b# v+ N- Q& D, `' f
  40.     memset(&client_addr, 0, sizeof(client_addr));
    ) x, v0 e5 A: Z
  41. ( V) B) D, E2 x7 f' n2 b; P" @
  42.     while(1) { . b; U' x+ T7 v
  43.         FD_ZERO(&fdRead);
    : Q) Z) e/ J1 Z  }/ i
  44.         FD_ZERO(&fd_err);  * g; W6 ^7 Q1 G4 t4 s- x/ P
  45.         FD_SET( listenfd, &fdRead); & W0 f8 N$ E: E
  46.         u8 cnt = 2;
    9 t2 ?) H' v8 R
  47.         if(connfd != -1) {
    7 J- K' ~$ x5 N  c4 h; W( A0 x8 b+ ^
  48.             cnt++;3 x+ W1 W- ~, y
  49.             FD_SET(connfd, &fdRead);
    5 O1 U9 c9 B* d' w! G7 R( I3 S
  50.             FD_SET(connfd, &fd_err);8 B* t) L1 g8 D5 O
  51.         }" `  z' q2 ?& ~% w' s" y! j

  52. ! J/ m, O" w) \; v0 O1 g/ j$ ]6 h
  53.         if(connfd != -1) {3 h$ U9 O' I# o6 B& \, V! q5 |
  54.             u32 rec_size = xStreamBufferReceive( g_trace_handle,
    + G0 h) h; k" t/ a( Y$ d3 c4 N- [3 B
  55.                     ( void * ) read_buf, 128, xBlockTime);
    ! \, `/ J- y  i3 s
  56.             if(rec_size) {
    + z; T5 f4 H- [7 `) w
  57.                 s32 ret = send(connfd, read_buf, rec_size, 0);
    9 g3 ]. i2 a! Z8 ^0 K
  58. & a% V' R$ b4 ~( x2 ~6 R* M
  59.                 if(ret <  0)  {  k  A7 ~7 n* ^4 x
  60.                     closesocket(connfd);- D, m9 U9 l4 A  m! I9 \0 x- y
  61.                     connfd = -1;2 F1 n' H% r- z3 L
  62.                     continue;
    5 {9 n8 a1 i, ~6 B3 v
  63.                 }% q( V" g6 {/ E
  64.             }8 m  X7 K& R0 U8 O; I8 e, S
  65. ; ]" w, i: i' t, `
  66.         }, S; ~/ o8 X) }/ P3 x
  67. 6 G% h2 R: z3 X" B) ]
  68.         tv.tv_sec  = 0;+ D& m; U0 \( D* H, g
  69.         tv.tv_usec = 20000;
    # ^- S. G' A7 t: @, V
  70.         s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);* x: I3 o. G0 U( R( ?1 O

  71. # H! O8 ]# y! E" ^7 K' c  Y
  72.         if(ret == 0) {- f) h/ J, O/ @2 T

  73. # n! O0 H* A$ \
  74.             continue;
    8 @% w. P8 r  x/ k' N8 _* k
  75.         }, r$ G$ u- M+ C% I7 m' B: t) L
  76. $ n4 S0 j7 x+ _1 X" P+ S
  77.         if(ret > 0) {
    ! H7 M/ e5 N  @' x( R9 |+ `0 H
  78.             if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.' h. G/ D7 m4 Q
  79.                 connfd = -1;
    0 H) Q/ ~$ L+ B4 U, M, H& Y
  80.                 continue;; x) O; ~& P( z& [! j; f2 D
  81.             } $ c4 V& U7 Z2 j! k
  82. ! W6 @$ c4 T& \! V
  83.             if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.0 @7 Q  }& [, {8 @
  84.                 ret = recv(connfd, read_buf, 128, 0);
    ) i  y( Y* Q4 Y/ w" e
  85.                 if(ret < 0) {5 r7 r, [9 E9 A1 O. _  e* V: L& a, y( m
  86.                     closesocket(connfd);
    ' Q1 y+ }! b/ T* [7 W; |% |
  87.                     connfd = -1;
    7 E. @( T0 b, X3 ^1 {! R
  88.                     continue;
    . p# C( }' o$ C
  89.                 } else if(ret >0) {
    : H" ^; T+ z) J* b
  90.                     WDBG("rec size:%d", ret);  J" L& S' G% T2 b0 Q) K* @
  91.                 }
    1 b4 h" @+ I8 B4 r1 N- z
  92.             }   
    # U: o9 e# v  x
  93. 4 ]# ^1 K* @3 M( A6 ?4 w1 [
  94.             if(FD_ISSET(listenfd, &fdRead)) {
    - H6 {4 C0 y* f  m
  95.                 s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);
    0 d! C4 H. {$ o1 W  k: r# q5 W, ^4 V5 i
  96.                 // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); & G# b2 D7 r( }: P

  97. / [) f  O% b! x: N3 M
  98.                 if(connfd == -1) {5 C( g- l: Y9 h" Y
  99.                     connfd = temp;
    1 G+ ^! Q( f. c+ s; L. K" j
  100.                 } else {7 c  E2 ~$ Q8 K' T
  101.                     closesocket(temp);
    8 ^' H+ V7 g: Z5 o9 \" t
  102.                 }+ T0 ?* m- I  H* k2 n3 z
  103.             }        9 N2 F$ F5 u. o* e4 \; h4 A
  104.         }
    ' N9 c% f" [0 p; ~. Q  B6 s
  105.     }   b# y( O/ B0 U7 @& I) `/ H
  106.     #endif
    % g: R) J" f2 ?" i$ q/ Q' N( w
  107. }0 D2 n5 ^' x( G
  108. # _' s. W3 A. y5 ?% C9 d# T
复制代码

  U( s; M1 A8 S, |  e* g  @
收藏 评论0 发布时间:2021-12-13 22:35

举报

0个回答

所属标签

相似技术帖

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