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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:35
STM32F7 LWIP socket 创建TCP server
7 \, G1 C7 J' q
  1. **阻塞方式:**
复制代码
  1. typedef struct {' M( H! v: p" p% z9 ~# L9 S+ u
  2.     struct sockaddr_in client_info;' |6 P5 Z2 X8 H; c( m  D
  3.     s32 id;
    * a7 i3 K' F- Y9 u
  4.     u16 port;4 S# {+ U. p7 I
  5. } client_info_s;
    2 Y9 g! M" r7 m% g0 }

  6. 4 [2 T) G' }* y, N: C' K
  7. void client_proc(void* parm) {
    6 n6 S5 G% a6 ]# ~# q4 k
  8.     client_info_s* info = (client_info_s*)parm;
      [1 F9 C- C' B) m
  9.     u8* rec_data = sys_malloc(1500);! B1 k1 r( N; E' e
  10. . s. C  ~1 u' M+ d) z
  11.     WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id,
    # @* k2 R" P* k; O, F! {
  12.         inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);) y8 p# b& V1 N7 Y; X2 m
  13. 5 Z( k3 S3 z: e: D* D
  14.     while(1) {
    0 k2 W- G& j8 T
  15.         s32 ret = read(info->id, rec_data, 1500);
    3 _- y) V% |" \( q( f4 D
  16. , t4 }5 A+ |. r# I, ?. P
  17.         if(ret > 0) {! B1 {! }0 R$ c8 V) A: Q+ S
  18.             WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);
      H6 e" y, Z" T! }. M
  19.             ret = write(info->id, rec_data, ret);+ ]+ G+ N7 w+ _* X+ I& O

  20. 9 U$ a  |" S8 J3 `: Y' u1 |# n5 w
  21.             if(ret <  0) {
    6 W0 Z1 k' h/ E" F3 H. _
  22.                 WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id, + X1 @# ~9 Y- g' ]3 H
  23.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);/ W' T" z1 G+ x9 q& {! x
  24.                 sys_free(rec_data);( z: O2 t4 |* A* t5 x
  25.                 osThreadExit();" s1 A  V  r+ y8 k* o
  26.             }! v1 D  Q5 _  K; n* ~
  27.         } else if(ret < 0 ) {
    / \- Q6 }) o! }$ T
  28.             WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id, / I, P( u" q* _" @! C- P% e
  29.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
    . s  L& ^" P3 s7 k0 \+ |* E
  30.             close(info->id);
    # G1 [- X, o. e  a0 A, V
  31.             sys_free(rec_data);
    3 O& A% @3 I- R% b
  32.             osThreadExit();7 P; j2 D6 ~, l& M4 n. @  Y
  33.         }            , t. q" A/ v  S
  34.     }
      V/ ?7 \" E- Q) N
  35. }: Q) z. K" _. s
  36. : Z) Q# i% w& W! N
  37. typedef struct {. [3 ?- U  Q3 E$ d9 P
  38.     u16 port;
    3 ^# w% U$ ?- M6 u6 y& x
  39.     u8 cnt;& e1 U4 S* w9 l* t4 U; N8 ^. O+ J
  40.     u8 rvd;8 A  f$ W( g/ ?1 N/ `
  41. } server_parm_s;1 o: U4 K( `! o1 m2 l
  42. 7 D" o. B4 K2 T( j8 B# Y1 u
  43. void create_tcp_task(void* pram) {, X' ]0 ?' l; W( |% i3 z
  44.     server_parm_s parm;
    8 t6 X7 x, H) [% h( {
  45.     memcpy(&parm, &pram, 4);
    % [5 K8 S5 \7 J# |! j
  46.     WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);
    ; S7 g# R0 \7 j" f) a; H/ u$ I% v# y
  47.     int listenfd, connfd; $ P% b( V* j" X2 |" r+ `, Z! L
  48.     struct sockaddr_in servaddr;
    8 j- y/ }6 z0 e
  49.     struct sockaddr client_addr;
    * k- D% s' y1 x. {; e/ w
  50. $ \1 }: z% @7 ?$ m( D
  51.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )9 M* p  M+ Y% c$ W% ~3 h; ^* C) k
  52.     {
    % C1 r1 r$ f% A
  53.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
    ( e3 y5 a' S* x- y1 s
  54.         while(1);
    2 N. D; [6 o8 j3 ~: m5 @7 _
  55.     }
    ; w! [: n+ f* [7 J
  56.     memset(&servaddr, 0, sizeof(servaddr));
    9 M* z  w0 q# j% X' }5 N. k
  57.     servaddr.sin_family = AF_INET;
    0 w3 l4 W! |; b; @
  58.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);            
    8 ^) X' `5 m4 ^* m
  59.     servaddr.sin_port = htons(parm.port); . Y  @* T' b% T' \9 Z

  60. % u  T0 ~% t1 Q
  61.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)4 z7 G& d& i) J8 d
  62.     {
    9 e* R& e2 h! g% Y5 Y
  63.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);$ s, {0 y$ m4 `/ H" c! ?* X" J
  64.         while(1);
    7 s) u4 H& h" D* d" X
  65.     }
    ( F' n( C) [5 J, S6 @/ w% O& m
  66. $ O/ r4 j& c. l* `  Q
  67.     if( listen(listenfd, parm.cnt) == -1)
    5 X! G4 S$ P) A; Q+ m7 {
  68.     {
    0 M/ n3 ~7 e# J' b) g- L
  69.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);: a* e, ]- A- k( r$ u6 z" b
  70.     } / E0 \( M: l1 D! E: |  A
  71. " P: z- F+ [# r- _& V; `' r: ]
  72.     while(1)) m- d' W5 `' I. z1 O
  73.     {
    6 w- ]: {( p3 T; i
  74.         socklen_t socklen = sizeof(client_addr);
    : [) B/ y$ x' i# x% K9 h
  75.         memset(&client_addr, 0, sizeof(client_addr));+ M9 E( I6 |5 v, S
  76.         if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)
    9 |. r. M& d& Y) ]6 g- E
  77.         {
    . D8 S. w+ C- @( t/ O
  78.             WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno);
    # a+ Z& s. v- q+ a0 B7 l. B
  79.             continue; $ ]0 \' e* B" m9 q
  80.         }2 I, Q( b% [- _
  81. " y5 X+ m8 j5 v3 g- n" L  z
  82.         client_info_s* client = sys_malloc(sizeof(client_info_s));
    0 O0 a# o+ [/ @+ M* ?# e' K  R
  83. ( ]0 R& x3 B4 n/ V
  84.         if(client) {
    " H7 U0 w+ q3 F4 [
  85.             client->client_info = *(struct sockaddr_in*)&client_addr;
    ; @1 z7 H8 I  D6 B* b+ E
  86.             client->id = connfd;* h! S6 {9 `# l+ Q, f& v
  87.             client->port = parm.port;
    0 `! s( u8 n7 u& |, ~2 q- r
  88.             osThreadNew(client_proc,(void*)client, NULL);
    6 p. _) m; G6 Y8 X1 O9 u
  89.         }
    . d, \- {6 E: d: N: R( l6 D

  90. * x7 A3 D: W$ [6 `
  91.     }
    7 V' u# J% Z. y
  92. }6 O9 }) k1 ~$ x2 O6 `6 J# R; l
  93. . P" B2 h7 k2 C: t8 H& c0 Z
  94. void create_tcp_server(u16 port, u16 cnt){
    . C* m1 i# {7 V
  95.     server_parm_s parm;
    * P0 I& f6 X8 W$ [) ^: A2 v8 |
  96.     parm.port = port;
    * |  \3 b. I; z, l
  97.     parm.cnt = cnt;
    / ]7 \! r) Q+ A/ G( H; O- h
  98.     u32* ptr =(u32*)&parm;
    9 E% Q" A5 r7 ~3 O/ m$ O
  99.    osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL); 0 T4 |. \9 k4 J* A
  100. }
复制代码

4 a3 h, O1 e4 Q, o1 i. ^非阻塞方式:
* e; f/ ?) _3 V- r+ i. g. d
9 z) F3 O6 R+ t2 q! }" K: _
  1. void trace_task(void *argument) {' u1 l) Q1 y( y2 j/ }1 k1 e, a
  2.     const TickType_t xBlockTime = pdMS_TO_TICKS(50);. W& ?/ D) `! a7 G) @
  3.     u8* read_buf = malloc(128);( U3 m: @1 z" V
  4.     WDBG("TCP SEVER port:%d", 1234);# t/ @3 l% u* ^: L. ^( F
  5.     int listenfd = -1;2 A" G3 ?' F! w* g" L& K2 B
  6.     int connfd = -1; ! u0 z8 @# t, \
  7.     struct sockaddr_in servaddr;
    3 ~6 _- Q  H! d7 T
  8.     struct sockaddr_in client_addr;
    : F- z. e5 p- C5 i! Q+ l
  9. ! f2 G2 s/ |6 {: s+ ~9 `9 v
  10.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
    4 l3 H8 e" @6 g: \( b7 w
  11.     {
      q7 a' ?( f1 D( q# o
  12.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);  G  P& z: Q5 I0 p" e
  13.         while(1);& `! X" T! U  ^% J2 }: F
  14.     } 8 o  e9 N! w4 Y/ o/ y& g
  15.     memset(&servaddr, 0, sizeof(servaddr)); - V& A7 s" S3 }+ d) X/ ^3 C
  16.     servaddr.sin_family = AF_INET; ( W* D! s- s3 V: C6 h
  17.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);             6 G  W6 k, v' P$ G, B/ x# j
  18.     servaddr.sin_port = htons(1234); % t) I" T# z6 W+ C9 T
  19. 4 K0 w$ }+ H0 r
  20.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)9 h; w6 S) T7 n( a4 {2 K; B
  21.     { 7 M; C4 v5 ]9 T" H. e
  22.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
    - |0 r; ]' V8 z1 P
  23.         while(1);8 `& ?" T8 q% D# V  p
  24.     }
    5 n- I( A" ?* ~: m

  25. 5 I9 d& @' h& N$ k. ]
  26.     if( listen(listenfd, 3) == -1)# B+ @1 l" e: i4 m; `
  27.     {
    ' |! C0 Y* B3 S+ U3 Q$ G
  28.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);4 F7 |4 O$ \3 J' r# y, d
  29.     }
    # ^  y& X2 k$ W: N
  30. $ W" O( d2 ~/ }0 y- ^
  31.     {
    8 r- M; R. n" x$ z: `% k; E
  32.         DWORD nMode = 1; + \0 K: Q3 P4 m
  33.         ioctlsocket( listenfd, FIONBIO, &nMode );        
    " Z  K& z* y' v* G8 U
  34.     }
    / W$ T5 I& K8 @3 f% z  {! B
  35. + F) }$ X$ {4 l  w3 X( H) |- t
  36.     fd_set fdRead; % C; X+ V/ }9 y$ t9 e2 ~
  37.     fd_set fd_err;
    1 L7 L$ P# ^: Y+ d, c) A- D$ M
  38.     struct timeval tv;
      m* S& s# N  N
  39.     socklen_t socklen = sizeof(client_addr);( e& E2 t  e/ I) g2 z- m! W' N
  40.     memset(&client_addr, 0, sizeof(client_addr));
    9 q0 s8 k8 P0 l4 ]0 R2 ?2 U( S
  41. 3 e: [3 o- F+ E) j
  42.     while(1) { ) ^' k6 k* J- i  s/ `
  43.         FD_ZERO(&fdRead);9 i% w$ }! F" F- ?4 K- g4 c
  44.         FD_ZERO(&fd_err);  / n9 ]6 m5 L7 T8 y, _3 G
  45.         FD_SET( listenfd, &fdRead);
    5 U" \* R; |* H( F
  46.         u8 cnt = 2;
    9 Z' |' I# O9 B8 `9 L0 D. q* A) M
  47.         if(connfd != -1) {  F1 C+ J! S3 \4 v) g
  48.             cnt++;& H3 x5 h/ T$ ~" M
  49.             FD_SET(connfd, &fdRead); 7 K8 f/ r/ W3 c+ e' f$ s
  50.             FD_SET(connfd, &fd_err);
    ! @8 ^3 k/ n* u  m: P. B: Y
  51.         }
    1 ~% o5 `$ |) ^( y5 g

  52. ) F$ s9 l  I: `" g- H! O7 Y$ ?
  53.         if(connfd != -1) {
    ( u: b& x- P4 w' h8 {$ n  T
  54.             u32 rec_size = xStreamBufferReceive( g_trace_handle,) u  U  ~  U' s. G
  55.                     ( void * ) read_buf, 128, xBlockTime);6 q6 ?8 U3 U( m2 R
  56.             if(rec_size) {
    . m- \& t/ E+ H. b! w& h& A
  57.                 s32 ret = send(connfd, read_buf, rec_size, 0);
    ; S* S& v# b( C$ V4 O4 j
  58. 7 H# G5 w- B/ q9 ^7 B6 o
  59.                 if(ret <  0)  {2 b# H. {" n7 P6 u2 ~' B+ `
  60.                     closesocket(connfd);
    8 z  \: j) ?0 P( I
  61.                     connfd = -1;( H9 p- e/ V: t0 o
  62.                     continue;' i  D* v7 W- ]  _! G
  63.                 }
    ' X6 z2 z! x* k) M; x  G
  64.             }
    ; K9 r3 x. E! T% o
  65. : O2 _, g* j2 Q  u( c0 D$ |
  66.         }
    " j+ t) ^! O8 C: q. @8 ^
  67. 0 V5 [! g1 Y' i1 E
  68.         tv.tv_sec  = 0;- Y6 N) a+ G! r' E$ h: O
  69.         tv.tv_usec = 20000;
    4 s3 A  p! N8 X4 u8 U& ~
  70.         s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);
    ( q$ R9 g. ~9 |
  71. & F  q* d$ V/ r7 {2 B4 E
  72.         if(ret == 0) {4 C+ ?; m# g0 x* g
  73. ) b/ s; n# [$ p; x. J% ~
  74.             continue;& P7 v' j/ L, |) I& U( j7 t, k
  75.         }& m/ p$ o1 V( p
  76. . Q! T4 q8 Q5 [5 b3 i" q8 n
  77.         if(ret > 0) {
    ; O! ]) @" |" O3 k
  78.             if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
    . f  o, t' q0 L2 x+ i8 ?0 }
  79.                 connfd = -1;& I3 O% C7 Y" `  X% A6 V
  80.                 continue;. ?7 E  E3 {; L6 [" T, q( W! c
  81.             }
    5 `+ b, B3 |0 \  H

  82. * A0 x/ x. s+ L4 P& b, }
  83.             if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.
    ) ?) f( o% e' B) v* [  m
  84.                 ret = recv(connfd, read_buf, 128, 0);
    ; A( v# O+ b! k$ w$ P5 f. O) z7 @0 q
  85.                 if(ret < 0) {
    7 H+ l# b% s, Q( f
  86.                     closesocket(connfd);8 ^% p& B3 @, E) E2 Q8 I1 S$ T
  87.                     connfd = -1;
    ! V: @5 R, ~! K% Q9 `* U
  88.                     continue;2 l* q7 ~5 l+ B1 l9 Z4 @7 h
  89.                 } else if(ret >0) {
    0 \, ]: h5 C7 ^  s
  90.                     WDBG("rec size:%d", ret);
    3 D4 ^! U: ~# n, A
  91.                 }4 T. E9 M# F2 h$ |
  92.             }   
    ; I5 X8 I- t) x1 ~
  93. 6 S& ]5 I5 t$ J) o% J
  94.             if(FD_ISSET(listenfd, &fdRead)) {
    - q+ j3 a' g. U( N% @7 m( _. E' T
  95.                 s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);; M. z. C- R6 B) j. R  x2 {3 n
  96.                 // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
    5 R, X" H- i6 X+ h+ i" z" ~

  97. 8 F: W1 R, B( R# u  |7 r/ j
  98.                 if(connfd == -1) {) x6 I" d4 t$ p, U2 W2 J- m( j, N
  99.                     connfd = temp;
    : {2 [3 c) k! g  X6 g& r9 P
  100.                 } else {
    ' t$ F% U9 O( y% t  a
  101.                     closesocket(temp);
    0 n" z6 ?6 R% {: T8 F: D
  102.                 }
    6 j4 h% N4 g& X( }
  103.             }        + }7 l9 H1 {3 h5 v8 m
  104.         }$ M* I3 X9 f1 V" d
  105.     } . m( R5 R- d/ y% n) |$ k
  106.     #endif
    , y. H4 @" t7 k: ?% P, y" N
  107. }3 `4 n: h8 ^7 s+ P# ?% U
  108. . u' _9 S3 f' x
复制代码

4 N/ i& q0 _4 ~8 n5 ]7 R
赞 收藏 评论0 发布时间:2021-12-13 22:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

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