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

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

[复制链接]
STMCU小助手 发布时间:2021-12-13 22:35
STM32F7 LWIP socket 创建TCP server
8 m8 H0 W  \5 }3 |
  1. **阻塞方式:**
复制代码
  1. typedef struct {# ?+ Z2 @5 ^+ C2 G" ?" `; v  A, p
  2.     struct sockaddr_in client_info;
    # ?( p0 M; B; n
  3.     s32 id;) [- T7 {- e# J% X  L4 v! m2 e
  4.     u16 port;
    5 y* g2 }& _, [( `' _
  5. } client_info_s;
    % N' ]& o: C3 U2 ^/ ~
  6.   ?* c6 n' b2 T
  7. void client_proc(void* parm) {' C+ X; n% r! V9 L# M
  8.     client_info_s* info = (client_info_s*)parm;6 B) d4 m( w$ T/ Q# X
  9.     u8* rec_data = sys_malloc(1500);
    7 X/ L; B" `1 |9 s2 P" t2 Q
  10. , f. W/ a' V- v# y5 x
  11.     WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id,
    / s& o! t+ j1 m
  12.         inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
    3 C3 }1 n: t- k! e1 i, Q( I' z0 @

  13. " T& Z/ N8 [! F
  14.     while(1) {
    ; |! ~/ b$ O# f1 s
  15.         s32 ret = read(info->id, rec_data, 1500);
    ) F. z6 U  t( _" c( V
  16. / B9 M: ^8 V& Z" V
  17.         if(ret > 0) {8 u2 C5 n. R( B
  18.             WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);
    + s+ L( @! U8 o( ^0 C& x( K+ ]
  19.             ret = write(info->id, rec_data, ret);
    # Z' e( `" L8 ]4 h* {. F$ G" a# N

  20. ' P; [$ e* r8 u# X3 \
  21.             if(ret <  0) {: K- T# x9 ^" k7 t
  22.                 WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id, ( B) f5 n4 h$ u
  23.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);" z: c8 c2 D6 `0 N( s% H
  24.                 sys_free(rec_data);. H8 a: x8 V' j/ a+ C
  25.                 osThreadExit();9 L) ?' S+ k- Z5 Q+ F
  26.             }& e( `8 O9 ~! r+ A6 n
  27.         } else if(ret < 0 ) {
      t$ }( r0 B7 e0 j4 ~7 F
  28.             WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id, % L$ Z* q( i2 g) g
  29.                     inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
    . s. e& O( T' r) r& [& ]5 F% b
  30.             close(info->id);
    $ B- X+ ^6 d! h
  31.             sys_free(rec_data);
    ! `; X8 V) k- P9 q; J
  32.             osThreadExit();
    . Y. W$ k# O2 l% [# ?  y  c% b
  33.         }            1 @7 M1 s8 M: W) r7 G; p
  34.     }
    # ^0 d. Q0 v; l* s
  35. }
    * u9 l( T4 V! _3 q: f/ r
  36. : Q" r* p  J1 T/ T9 L; X, R
  37. typedef struct {
    # K. Q7 b' k$ e; g' J: B
  38.     u16 port;; ]2 m7 u1 @& f% S8 ]) j
  39.     u8 cnt;
    + p1 n# ?! I" e( X/ W
  40.     u8 rvd;- W) m; z) i3 M9 ^2 G9 |
  41. } server_parm_s;# f/ W: {+ o, p- e. X
  42. 6 J, @1 _5 @! \/ {
  43. void create_tcp_task(void* pram) {8 x) A/ H9 s, v$ t
  44.     server_parm_s parm;
    % q5 c) c" {- s# {# ^) z2 |
  45.     memcpy(&parm, &pram, 4);/ V- d% G$ C; s' U& _; u
  46.     WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);
    0 q3 y5 o5 {! \8 a. W" l! z
  47.     int listenfd, connfd;
    & R) p0 v# J/ e1 N" T" J
  48.     struct sockaddr_in servaddr; 4 h  P( \7 {8 W4 D( V! {
  49.     struct sockaddr client_addr;/ d( `& _6 F7 m3 u" }. `
  50. 7 h0 n0 ?( v) ?" O  Y
  51.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
    " L/ S4 ~7 W: b8 I% C' J
  52.     {
    : O: N2 `( J4 B+ `
  53.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);% P" `6 D. r" |% }$ }
  54.         while(1);1 J  T4 Y# y  A7 L: s. P
  55.     } 5 n2 H) R" w0 V3 E' P7 S
  56.     memset(&servaddr, 0, sizeof(servaddr));
    8 `, f! ]9 H: z/ _7 ?1 p, V
  57.     servaddr.sin_family = AF_INET;
    2 Y( ?) K) e9 m9 e. R1 I& n
  58.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);            
    ( ]2 F! C( ?6 d! Y. r
  59.     servaddr.sin_port = htons(parm.port); + `8 Z# t% b+ ^2 h# v( @. ?& a1 E/ [

  60. % _& `. ?( `3 R3 d
  61.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
    ! M) z6 q. x+ j
  62.     {
    0 c3 V4 N8 ~* G. d. v, k7 N
  63.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);, u% Z2 D& j8 d( @9 _: K" f/ d; h
  64.         while(1);
    " c" [6 Z* Y' Y7 [6 c
  65.     }
      x9 W# O" N* @9 Y6 v

  66. " k% n9 ?, _9 y" L0 i0 x6 L9 f
  67.     if( listen(listenfd, parm.cnt) == -1)
    8 X2 f3 e1 b" y% Y
  68.     {
    - @9 u+ j9 ~/ y( L! K: J" q
  69.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
    6 n. e0 t" T# g% W2 G& \# k
  70.     } ; j" P6 A9 d; D
  71. - f! V5 U. `8 k: V- W3 J
  72.     while(1)
    3 M9 u8 M" T0 B6 ]! m) R
  73.     { " P- s/ H' m3 L2 v& y9 w
  74.         socklen_t socklen = sizeof(client_addr);! m& `# Y; G3 ~: I0 }* D9 R
  75.         memset(&client_addr, 0, sizeof(client_addr));' ^$ G6 K8 P8 Q+ @# J
  76.         if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)
    . h$ |9 \' ~% j( ^- O: U
  77.         {
    , ]* x5 k8 h6 J: G
  78.             WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno);
    + c& Y/ X0 T1 v# j2 D/ P2 _8 \
  79.             continue;   u4 e3 e. [3 v9 w9 [6 o
  80.         }
    7 D' x6 Z0 @9 `
  81.   W( d# ^, j; j. X; y2 Y; ^$ N1 o* q
  82.         client_info_s* client = sys_malloc(sizeof(client_info_s));
    7 h) W$ D& ]' v% ?) ?
  83. ; O( L1 H% {2 B2 O0 @; @3 v, A. W. }
  84.         if(client) {% L6 C% M( p) a/ X
  85.             client->client_info = *(struct sockaddr_in*)&client_addr;4 ~! o0 H8 L( H7 d: S
  86.             client->id = connfd;
    ) H- O/ h2 U7 ]- z' Y2 r+ f
  87.             client->port = parm.port;
    / h5 t6 {$ N$ I  W& W; Z
  88.             osThreadNew(client_proc,(void*)client, NULL);
    4 s$ t$ j; c# C: m* _
  89.         }( Z! L, r% ~0 Y6 r0 {! A
  90. ) w) v9 r$ d8 ]9 w' y
  91.     } 7 V: a6 ~% f8 _, V1 a
  92. }/ ]1 V8 t( b5 f

  93. 2 S+ x+ B7 p7 b4 w: d6 ?
  94. void create_tcp_server(u16 port, u16 cnt){
    ; h; N& X' R- `' u- m
  95.     server_parm_s parm;
    4 e0 W6 n: j9 t" \) n
  96.     parm.port = port;$ @2 r; @, {4 ^: J! |7 b& ~6 q7 e$ g
  97.     parm.cnt = cnt;
    2 i' q& @) ?; Q8 s
  98.     u32* ptr =(u32*)&parm;
    + ^3 r1 A% a4 c1 G# g" h
  99.    osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL); 5 X0 {4 p; H! r" P% \
  100. }
复制代码

* w4 A5 r* \8 D# f非阻塞方式:! X; U! j  }2 z8 U6 u" @
% a* _: @+ ^2 B+ U, k
  1. void trace_task(void *argument) {
    8 @1 D" [) {7 O7 l* N
  2.     const TickType_t xBlockTime = pdMS_TO_TICKS(50);7 ~4 }" b! v* @: R9 ?5 p  F
  3.     u8* read_buf = malloc(128);3 U5 i: Z5 P! Y# q- M3 ~& H8 ~% c; W
  4.     WDBG("TCP SEVER port:%d", 1234);
    ! b4 C3 P. \* _  f, ^9 w
  5.     int listenfd = -1;; i+ {! u) U( W3 ]3 @! w* p
  6.     int connfd = -1; ) G0 h! U# r1 {
  7.     struct sockaddr_in servaddr;
    , O6 M1 Z+ X' [" Z! x- t3 T. z
  8.     struct sockaddr_in client_addr;# e/ f, _# m, L2 L* C

  9. 7 ]: H0 j  u4 }4 Z
  10.     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )+ y' ?0 u5 |7 [: \* A% r* I/ ]- r
  11.     {
    " P+ M' S% L6 k* C/ S
  12.         WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);9 Q: k' s, G- x
  13.         while(1);- k' Q/ a3 [. {( ?" F3 e, J( [
  14.     }
    1 H( o6 Z* R+ f3 h+ G4 u
  15.     memset(&servaddr, 0, sizeof(servaddr)); 8 v! Y: v. b3 ?# t% z0 }& O' u
  16.     servaddr.sin_family = AF_INET; % Q2 F7 h+ K1 [+ L
  17.     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);             0 R7 C" \! p* A
  18.     servaddr.sin_port = htons(1234); % H; g( x0 u! w. M# \/ Q
  19. ( m4 |! d2 H4 z# ]% U4 ^; w$ ~
  20.     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
    5 d* ?& W5 ]; F+ q) ^
  21.     { ; k; w; C0 D# I& f# B: [
  22.         WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);( H, i; f7 O' q
  23.         while(1);9 e9 {6 B9 j- G+ L7 N1 D( O
  24.     }
    : \% T3 l- B8 [8 \) ]; o

  25. ) [3 P8 A+ _4 B' f* D
  26.     if( listen(listenfd, 3) == -1)( L# m% B4 _) v0 p
  27.     { 9 G% h; @5 I' @
  28.         WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
    $ r' ^  R( ~4 c2 `
  29.     }
    3 Q1 }/ X( Q4 |' A8 e

  30. * V' y! w# g! K, M
  31.     {
    4 z0 X; r5 I) s% t. B8 b. l9 m
  32.         DWORD nMode = 1; & @' x1 S1 x; p5 {  f0 y- O9 x  O5 {, T0 X
  33.         ioctlsocket( listenfd, FIONBIO, &nMode );        4 t2 d/ Z# f& d% A1 I" B
  34.     }
    ( J- v* N/ E3 U+ p' D
  35. ! o& y. W4 D/ J& R; r
  36.     fd_set fdRead; 7 c5 g7 R" V) h8 v2 M$ C4 p
  37.     fd_set fd_err;
    $ T3 _. ?6 I, @/ k2 `
  38.     struct timeval tv;
    5 ?0 B4 ?: V  H/ [& _; N
  39.     socklen_t socklen = sizeof(client_addr);- w/ C8 T7 `3 d+ K% A  B& O* c' X
  40.     memset(&client_addr, 0, sizeof(client_addr));
    % q! R9 _0 Y: R

  41. : X/ B6 u4 o7 D; q& G' ?# p
  42.     while(1) {
    2 J/ v/ j5 {$ H6 {& N! C5 s
  43.         FD_ZERO(&fdRead);
    % ?* U. s* H7 L- K
  44.         FD_ZERO(&fd_err);  % H* [$ s$ P8 l
  45.         FD_SET( listenfd, &fdRead);
    ! K, s5 \6 l+ u& \4 `
  46.         u8 cnt = 2;; |% s! C/ e1 H6 t" G
  47.         if(connfd != -1) {
    3 x# V+ \/ Y, Z' {; y# V% z' j+ k
  48.             cnt++;
    2 z+ h. h5 ]. Y
  49.             FD_SET(connfd, &fdRead); 4 X; X  P! E( t& P
  50.             FD_SET(connfd, &fd_err);
    : M- K  ?. d3 k( k6 U6 f1 }
  51.         }
    : @; m- T. R7 X0 p" }

  52. - P) K" d# F# A4 D. ^3 M
  53.         if(connfd != -1) {2 o. ]7 E4 r! C, w
  54.             u32 rec_size = xStreamBufferReceive( g_trace_handle,
    # d, D! f6 n' B+ c2 }8 p2 g
  55.                     ( void * ) read_buf, 128, xBlockTime);* a% d; w6 m2 N/ X, C
  56.             if(rec_size) {5 P7 C) b6 |: X: a; }( }* M- M: j) c
  57.                 s32 ret = send(connfd, read_buf, rec_size, 0);
    4 f0 r5 F& C5 ~& |2 S9 i2 y( U

  58. - j. s! \2 Z' _
  59.                 if(ret <  0)  {, p3 ~- g0 ~( C# F# x! J
  60.                     closesocket(connfd);0 u- i2 _, k! q
  61.                     connfd = -1;
    9 F/ e- T/ c1 j, S
  62.                     continue;  Z' u$ p2 J0 q+ m, g3 }
  63.                 }  k, X2 T! O, U6 W* C4 S
  64.             }7 y$ f: G4 m4 O! y9 l! ]

  65. 1 @# h& t+ V) p* R* @) D5 U
  66.         }
    ( X' T/ H9 L& {( j3 n/ F5 }2 o

  67. - u( a1 ?. B, J2 n% P# u, C* @. [
  68.         tv.tv_sec  = 0;9 d1 M" n- i# N) o( I8 V; r% T
  69.         tv.tv_usec = 20000;
    , }5 p9 q, @. ]& ?# B" L7 f
  70.         s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);
    5 ^7 \  w( Z, N
  71.   a2 f+ l( [/ h& z
  72.         if(ret == 0) {
    * t1 A' N! e! [$ [7 m; e

  73. 2 @6 @1 c( ~' w# P# c
  74.             continue;
    ; Q6 O& j0 T/ @' M' d' J3 t2 d: Y4 i( a
  75.         }
    : G) G5 @  T) a6 o

  76. 6 I3 k- C5 ~. e5 i
  77.         if(ret > 0) {$ ?2 S( l. B6 Z! ~' d5 m5 N0 U) s
  78.             if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
    / E8 E! Q0 b3 Q  X4 b1 x
  79.                 connfd = -1;* T( r9 l9 s4 R0 K" @. ~
  80.                 continue;1 o1 A( h/ F% v
  81.             }
    9 n3 P& O" k* T5 O  e
  82. & T4 W% X/ _; o0 ]
  83.             if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.
    " w0 D3 ^1 a4 O" S7 y. a( K: O; s
  84.                 ret = recv(connfd, read_buf, 128, 0);
    1 p* [  C4 L% c* P
  85.                 if(ret < 0) {& f% Z2 ?: t# O( a
  86.                     closesocket(connfd);1 Q! s; c$ |1 l, p; i
  87.                     connfd = -1;
    ; z5 A  Q1 c) w" [7 b! y& \
  88.                     continue;. E4 T9 _4 D) G
  89.                 } else if(ret >0) {( s& ]2 I* m6 w' n* Z4 d
  90.                     WDBG("rec size:%d", ret);( y4 c! Z, N  ?5 ]2 K1 }
  91.                 }% W9 F5 _8 ]$ ~
  92.             }   . P$ h/ \! l5 w# N; y, k% A  q
  93. ! c: w/ ?( R% f8 Q
  94.             if(FD_ISSET(listenfd, &fdRead)) {6 b+ V+ P, Q. f- f; h* L) j
  95.                 s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);. Z( d8 e  w" I2 }) Z$ {5 d5 y
  96.                 // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); " r0 h$ v  x" G; P

  97. 2 [8 ]( ^: p& l. a% c
  98.                 if(connfd == -1) {
    . w8 \5 r, c7 j. V5 Z$ K/ e3 J
  99.                     connfd = temp;0 \( d# C/ C* H$ E. p% w7 B
  100.                 } else {% O( p) O6 u& g
  101.                     closesocket(temp);$ X) `& n- l0 N: n/ Q$ N; q& `
  102.                 }
    8 a. d$ K; @; R+ }! v/ s; m
  103.             }        6 U& T8 n8 G, G2 d
  104.         }
    # l+ H* D3 w& Q- s  A3 F
  105.     }
    + |( n# `2 y0 G# v4 r+ }
  106.     #endif
    ; \! p: ^6 y" p+ X/ U
  107. }
    : ?- b3 D% T- y
  108. 9 C/ U, v! k" O1 r
复制代码

6 B4 G$ v% a/ x2 l) u
赞 收藏 评论0 发布时间:2021-12-13 22:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

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