请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:35
STM32F7 LWIP socket 创建TCP server
+ {, D. }8 H# w8 w
  1. **阻塞方式:**
复制代码
  1. typedef struct {
    " }( E  o' H' W. p8 r) {  _$ P# I
  2.     struct sockaddr_in client_info;2 D, G: g. O* ]7 K
  3.     s32 id;
    ! p( Q. C" \$ T. q* Q) T/ Y$ v
  4.     u16 port;$ u5 L' I  X7 Q/ y. M1 W
  5. } client_info_s;
    4 l7 e, g0 X4 {, \( d9 `

  6. 3 R% v8 N7 J, w+ K2 L; o
  7. void client_proc(void* parm) {/ S& t& N8 S* }" t; ]7 z: N
  8.     client_info_s* info = (client_info_s*)parm;
    4 ~8 |) ~# K- W" a2 R2 m$ H/ O, o8 B# f
  9.     u8* rec_data = sys_malloc(1500);
    $ l4 i1 \) O- b  C& h$ R5 y( l
  10. 4 X- ~+ i' b: o: ~2 W
  11.     WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id,
    # U% c( P( _$ W# _" P" T% d
  12.         inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
    6 {8 T) i( {8 L* o; r

  13. 6 p( V1 n1 Y4 j5 p
  14.     while(1) {( b, u: q3 c# T) i; O: o8 x
  15.         s32 ret = read(info->id, rec_data, 1500);/ e% p- h! N" l/ r2 S+ c

  16. 5 m/ @: m  C! M& l0 W
  17.         if(ret > 0) {
      {+ V1 \1 S: h" y# @! d" G( v
  18.             WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);
    / a" h0 n# ^& e# V3 l
  19.             ret = write(info->id, rec_data, ret);
    6 e! r( w+ R# V) ^8 U4 i2 _  g
  20. ' T* D/ x% q6 ~5 v% Y2 o* }
  21.             if(ret <  0) {/ G7 K+ _6 w% K# D, P
  22.                 WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id, 8 P: p# C% Q! s; q
  23.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);) l+ U" u, N6 k0 _
  24.                 sys_free(rec_data);8 C  `* T6 I: D, l# k
  25.                 osThreadExit();) @) M3 w3 e9 d, `
  26.             }
    ' n6 c/ U- O; r. _) Q  I
  27.         } else if(ret < 0 ) {! S  ~7 D7 \; Q3 v, f
  28.             WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id, 6 U, z8 [0 b5 U# c
  29.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);5 n9 V; _6 F( m" Q
  30.             close(info->id);
    5 s% U7 T4 }* Z9 J8 u8 Z  j* c. c" a
  31.             sys_free(rec_data);3 c* T+ m3 `8 h
  32.             osThreadExit();( g5 [% Z: L7 V' ?
  33.         }            ( o& j) i6 Z" |
  34.     }
      V' g* `& r+ u8 A# u  E
  35. }
    7 n; ]* S$ h  p4 T) ^

  36. % T  m: a2 H! O) m! _4 b) e# V5 O+ J
  37. typedef struct {
    5 U" ]2 \3 W8 A1 j+ G
  38.     u16 port;. C$ Q- {, ^. k7 \0 ?
  39.     u8 cnt;; m/ w$ A2 B. D0 v
  40.     u8 rvd;* W# f5 g- L5 x! g
  41. } server_parm_s;# q2 h2 P; M4 C0 ^

  42. ; V3 |" W5 o$ B5 A' ^4 v9 z1 @
  43. void create_tcp_task(void* pram) {
    8 ?3 H# [) |: T9 {3 l8 V' k& y
  44.     server_parm_s parm;
    , [9 h3 N9 n( o' M5 G
  45.     memcpy(&parm, &pram, 4);
    ; h( p' U% g; f; p: D: r$ B1 A
  46.     WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);
    ) \: A" ^" p6 k) @: h
  47.     int listenfd, connfd; - F( t4 R) @9 r) K8 _0 P9 |+ N0 }
  48.     struct sockaddr_in servaddr;
    : R$ ^* q6 ]8 `8 m. A) w0 N
  49.     struct sockaddr client_addr;
    ! w% l& n9 [: X5 H# \* k. }

  50. % ~9 W: u  \: Q+ t
  51.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )) @. i+ j4 z# x- @0 O* F
  52.     {
    9 J0 M. O$ k5 d' M- e- {; N
  53.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
    / x. L) F* `# ]* ^/ D3 y
  54.         while(1);7 R/ D6 k; o# i* B
  55.     } ) r; \2 e5 ?; [( g
  56.     memset(&servaddr, 0, sizeof(servaddr)); ( ^) I0 k( M  E/ K5 d" |7 Q) Q5 q- R
  57.     servaddr.sin_family = AF_INET; : _* [* ^; N4 \1 C
  58.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);             2 v% C1 j* J# ~7 c4 G1 y9 e
  59.     servaddr.sin_port = htons(parm.port); ( g; Y) n+ T+ Z7 i# I% I. j/ f$ U

  60. , O, p6 H. b( O! D- X( J8 X
  61.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
    * `# ]+ {# i# J  c/ j7 v/ `3 T% C
  62.     { 8 A/ C; f7 h1 U+ ]
  63.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
    * U; m- J+ l* ?8 {. x
  64.         while(1);
    . Y. B. B, v! k
  65.     } . v1 f- f* t8 j  D9 \1 Y

  66.   E% K" O7 p% S0 u3 |
  67.     if( listen(listenfd, parm.cnt) == -1)/ u9 |* V7 J3 B. L: R4 K
  68.     {
    : B) U% ^0 J4 q$ s: H$ ^
  69.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
    , L. S' Z$ ?" T, d" y7 T9 m
  70.     }
    7 j* N+ _5 [: u4 q% K0 a

  71. ; G" o) p- E0 z& g8 I  s
  72.     while(1)
    0 i4 _: n; ~: Q; q2 k
  73.     { 6 Y7 g  M# Q8 B6 H
  74.         socklen_t socklen = sizeof(client_addr);
    ! t6 m* O9 X0 v% v9 g
  75.         memset(&client_addr, 0, sizeof(client_addr));$ {  r" J# e$ {8 ~
  76.         if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)5 V" A# f( [# z; I5 i4 u8 |# k
  77.         { 1 H: F% ^5 E, W) p. [6 j# [' |
  78.             WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno);
    # r! \: `: |& H- v1 }: r5 v
  79.             continue;
    5 x6 c: e7 J3 N
  80.         }
    # p4 ~* b7 d: ?

  81.   V- `" ~: h7 _+ R% k' E) U
  82.         client_info_s* client = sys_malloc(sizeof(client_info_s));7 G' a* x/ L# d9 M3 x
  83. : |" \7 J1 L9 c2 g- Q- t8 v
  84.         if(client) {* W: t! V/ B! L* u% I
  85.             client->client_info = *(struct sockaddr_in*)&client_addr;+ Y+ X; a) m+ l  X7 w& ?
  86.             client->id = connfd;( ?: k% }% C+ c$ F& [; ^+ J
  87.             client->port = parm.port;% i0 a( z0 I( Z: _% `
  88.             osThreadNew(client_proc,(void*)client, NULL);
    - |% N# D' L: U2 r9 F, ]4 F
  89.         }
    % _: e6 m6 H( y5 \; @
  90. 1 L$ X, N6 e; g% I5 h
  91.     } $ p; x! t' Z5 u
  92. }
    ! D+ Y0 |+ ^: y1 g4 ?2 n5 S

  93. 4 Z( N7 S3 w0 K
  94. void create_tcp_server(u16 port, u16 cnt){
    " V8 t& N) w; z: i
  95.     server_parm_s parm;/ o) E5 E# k7 Y! u( {
  96.     parm.port = port;
    6 W: C* I' t; U; |
  97.     parm.cnt = cnt;
    0 L! q  e$ |2 j, y5 f9 d; C& h3 c2 W
  98.     u32* ptr =(u32*)&parm;
    + X/ R% z. ?# R4 z, p
  99.    osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL); 7 J# M( {& \& _
  100. }
复制代码

2 P+ q% [9 Z3 c  I/ C非阻塞方式:
( i8 j( d4 p( v; _( F/ C- |- }% b8 s1 Z5 f! w5 y
  1. void trace_task(void *argument) {. j8 W7 E3 O1 n1 Q0 ^5 p5 S3 D8 z( z0 w: `
  2.     const TickType_t xBlockTime = pdMS_TO_TICKS(50);
    8 h  q, f5 P8 u0 E4 c) `
  3.     u8* read_buf = malloc(128);( Y% V5 F/ y# v' a
  4.     WDBG("TCP SEVER port:%d", 1234);
    4 c1 i5 l! t7 M" a" N, A6 d
  5.     int listenfd = -1;
    : ]. l) i" Q' a
  6.     int connfd = -1;
    ) Z9 c# V! D  X  i( }. S
  7.     struct sockaddr_in servaddr;
    + P9 K" J3 ?9 t- C0 s
  8.     struct sockaddr_in client_addr;7 j0 T8 D" @6 [4 E/ k: {, X

  9. " L7 F" j7 z& V" h5 D; f& m
  10.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )+ s3 O, E; I' ?! v
  11.     { + D: S! v8 n0 `' L" ~
  12.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
    * j! s! H: C3 j, I* f6 _" S4 y% r
  13.         while(1);8 d5 e' Y" \3 S8 W& D, d2 Q: e
  14.     }
    , F+ D0 Q0 e. h1 y) _, m, \6 k
  15.     memset(&servaddr, 0, sizeof(servaddr)); ! |* A& w* B( k; t1 u
  16.     servaddr.sin_family = AF_INET;
    5 b" E, y' j% @9 Y1 S
  17.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);            
    ) h3 F0 D/ Z2 J# J9 R, i
  18.     servaddr.sin_port = htons(1234);
    3 R2 j. ~. u7 ?) n: K  O

  19. ; B* q! f3 O; l$ b
  20.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)* s! n# y: Y) A- v
  21.     { 7 C+ p5 z7 q2 F  ~
  22.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);% B/ o: ^8 W7 B& ]% ~! \2 s1 y- F
  23.         while(1);
    # g- K: v5 h. ?3 s! }* {
  24.     } $ L, N) v4 ~2 y% i- h

  25. ' ]( v* m! V" u9 O% D9 x
  26.     if( listen(listenfd, 3) == -1)
    , w& c) |4 B9 z8 |! J$ t7 o) E
  27.     {
    ! [' }% `+ s: M% D
  28.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);( R1 y4 _( z  V8 Z! C  ]
  29.     } ' h5 z1 M  F0 N5 k$ x! s
  30. 7 k9 ?6 q4 ]+ V  h& A9 u
  31.     {
    " x( `2 @' B: U; i
  32.         DWORD nMode = 1; , y7 B1 D' h+ E) b' Q& [
  33.         ioctlsocket( listenfd, FIONBIO, &nMode );        
    : F6 Q3 Q  R+ w  }9 m! E! z5 l2 V
  34.     }+ s* u1 o3 b$ v5 N: \3 m2 U* B% L. |

  35. * M; {8 b! M4 p4 D. \" w* V% ~0 k, W
  36.     fd_set fdRead;
    % h- M! T9 Z8 f: _  ^
  37.     fd_set fd_err; 6 B. Z. }) ?! I# _8 P* Y8 s
  38.     struct timeval tv;
    % t: g3 b) O: q) f, C2 D
  39.     socklen_t socklen = sizeof(client_addr);
    ! c/ H) {) R, C3 W3 l! d$ c* W4 x
  40.     memset(&client_addr, 0, sizeof(client_addr));
    * W& D0 j' B' T

  41. 5 T% |4 [! A6 l* U2 B
  42.     while(1) {
    & f$ |! A' `: t4 @
  43.         FD_ZERO(&fdRead);
    : A& {7 F- l& x6 |" d  F+ S
  44.         FD_ZERO(&fd_err);  
    2 [$ L7 E; B. H  o( b) c; u& f
  45.         FD_SET( listenfd, &fdRead); * v6 @  w: [7 C5 E# I7 N
  46.         u8 cnt = 2;; k; n* Z5 A# G) v" |2 l
  47.         if(connfd != -1) {
    9 m$ z; U) f0 [5 t6 g( [' L
  48.             cnt++;/ M! x6 w) M. ?$ |* i7 H( N
  49.             FD_SET(connfd, &fdRead);
    " }6 j- q& E# ^0 E6 c6 y( L0 X4 r! c
  50.             FD_SET(connfd, &fd_err);5 y* B8 a% f% k3 k* f
  51.         }
    + o* A( K! N; q4 K4 a2 Z. W

  52. 3 e8 t  J& K4 i  }1 x3 z
  53.         if(connfd != -1) {1 g+ t0 K7 u* h: w0 s
  54.             u32 rec_size = xStreamBufferReceive( g_trace_handle,
    2 |* E! q9 L) k/ Z& x3 X% k* c
  55.                     ( void * ) read_buf, 128, xBlockTime);
    " n+ v8 r& Z  A
  56.             if(rec_size) {
    4 ^: N, u: ?9 ]9 k) z0 i
  57.                 s32 ret = send(connfd, read_buf, rec_size, 0);$ o8 K" e- H( c) Q
  58. 0 k) z7 }/ ?' V
  59.                 if(ret <  0)  {; e: n1 \/ F  F3 [
  60.                     closesocket(connfd);3 r( g/ j" \  U6 H
  61.                     connfd = -1;$ h! t6 j2 o% R0 Q& A1 U
  62.                     continue;2 X9 G5 e! g4 _# ~% w
  63.                 }
    . K1 }" f# g1 y- O* [
  64.             }; F. h' t% Y! z2 _" _
  65. 4 ?9 U6 t" V) T: |, B$ K' A
  66.         }  ^/ [' a/ h9 C; q5 v* E

  67. / ^: S/ c+ i" h# V2 v3 u/ S
  68.         tv.tv_sec  = 0;2 ]& J- |$ S2 U
  69.         tv.tv_usec = 20000;
    # H5 f" _' Z( J! Y0 X+ {
  70.         s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);
    2 p$ a2 S' f8 E; s8 f
  71. 1 C  F- s, g" C: @7 c  B
  72.         if(ret == 0) {) y4 Q) a! C8 K" |

  73. ! ]. I, \$ M4 i2 Z! P* r
  74.             continue;; T- E9 J- N& Y6 b2 z& i+ l
  75.         }( G3 h% |8 L& z* F- g$ {
  76. 1 I5 R/ \) l! F* ~$ ]0 Y
  77.         if(ret > 0) {* k: S1 j$ V* D) U$ I1 O1 b
  78.             if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
    ) y, S+ W& A9 z0 I; G% L
  79.                 connfd = -1;# A' ~9 ]0 \6 y$ {( [. b
  80.                 continue;
    - z8 y, z- @0 U/ u
  81.             }
    & v" O* k9 d; o" F

  82. 8 {/ P- O) F( h  A
  83.             if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.  s  H- m3 g! H/ l! B) C$ q
  84.                 ret = recv(connfd, read_buf, 128, 0); 4 b; V. |1 S2 g# P+ y& I
  85.                 if(ret < 0) {
    6 ?- w# h2 o' c
  86.                     closesocket(connfd);
    " y# G6 y9 Q' p8 G/ q  T% W1 M
  87.                     connfd = -1;
    ( W# |# F8 D. Z( U" {  b9 B
  88.                     continue;1 i$ x  v* v; |# q& B6 w$ Y
  89.                 } else if(ret >0) {
    4 ?4 H' G% B) M' v0 v5 X
  90.                     WDBG("rec size:%d", ret);; Y. T  ?2 R4 [/ j- l
  91.                 }
    , A/ i+ z5 c  Y: Q' q. ?
  92.             }   9 m6 x3 r. {0 w. [( D- P  f, E/ H

  93. / P5 I8 X5 D8 V, z  ~; `& B4 o8 |
  94.             if(FD_ISSET(listenfd, &fdRead)) {1 i: m' w. ~  ^
  95.                 s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);
    ' g  v  Y& i6 h6 x
  96.                 // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); : _5 r, p0 f5 c6 a, n4 Y, I7 R' A# P

  97. & z! z1 d1 S# H% P
  98.                 if(connfd == -1) {/ J8 d4 h3 I. `- ]+ u
  99.                     connfd = temp;; q2 Q, J8 U2 B. c* b$ T2 k
  100.                 } else {
    1 y4 a" `) ~( ]; q7 K2 B! c: |
  101.                     closesocket(temp);
    ! K; K* |  t0 z0 g( @" x
  102.                 }
    " K% C$ m' P7 U0 F- t6 _* Y; @
  103.             }        
    1 ~9 ]9 x$ Q+ M3 {
  104.         }
    , Y7 Z  Z+ ~- H/ _/ {
  105.     } 0 g( W# w6 R& [" J" N
  106.     #endif
    ; a9 y" M& z& q! M" v$ w- r4 K
  107. }
    4 c* }! T" ]2 A' q9 e

  108. ' M/ |6 {" ]4 ~) v; q% @% c  r
复制代码
" ~: c" D8 K1 t8 h9 b2 j- Q
收藏 评论0 发布时间:2021-12-13 22:35

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版