STM32F7 LWIP socket 创建TCP server
1 h+ m3 `- l4 K n1 L- typedef struct {
. X6 w' o% w1 F3 Z, v9 U - struct sockaddr_in client_info;
0 I" D% C$ u' u5 O - s32 id;$ A1 A- W0 b) k. M J/ [; ~
- u16 port;# c9 U k9 U1 {7 Q
- } client_info_s;
6 Q8 { [. k3 y+ s! _ - ( x+ D7 O4 i0 \0 m3 w) d
- void client_proc(void* parm) {" Y4 j, ?' s/ z3 t% m, L
- client_info_s* info = (client_info_s*)parm;+ C, M' h9 l4 I. \# A% V
- u8* rec_data = sys_malloc(1500);
" }! D7 E* o6 H5 r - 7 V3 r# j% G5 m& V( ?
- WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id,
w2 X$ F, c, O$ u0 j3 t6 ^ - inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);- a* Y( {: o- Q6 a+ l6 }! }# g" [
& h1 v8 o. A3 I4 Z( ^2 {* N- while(1) {
2 D% a: s' k, O7 j' [ - s32 ret = read(info->id, rec_data, 1500);2 P K3 G: |+ @. C+ S- Y
# C L0 {9 I0 a; O# H- if(ret > 0) {5 @( N# O9 z9 q- L# I
- WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);$ @+ d) U/ X# X3 J
- ret = write(info->id, rec_data, ret);5 A. \! x& d) l9 G
4 x" H. p; X4 P. M, T. p- if(ret < 0) {
0 y& E; S- _0 m! k+ [+ [ - WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id,
0 _% x: V# @4 D/ N2 O/ [& Z1 A6 s - inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
% q- b, I4 [1 `8 D - sys_free(rec_data); S2 q4 L/ _5 l& l, v
- osThreadExit();
1 ]" d" N! z9 v9 O8 J( J& w - }% O- M1 J0 I Z, J/ a
- } else if(ret < 0 ) {' G; h. G4 r9 q+ @0 N
- WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id,
9 j. n2 q8 I8 P% k4 i - inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);& N0 {' Y6 U; B" [7 @
- close(info->id);+ C& b3 C* g& h
- sys_free(rec_data);
6 U1 I5 S, F- J n5 G - osThreadExit();
. M; W' S+ d1 B9 O, |" O) y - } 3 Q6 _7 X( }& P$ ?+ ]: w7 x' z& X
- }' S/ Y3 ]* b8 c7 G0 a
- } Q3 j- B( P& c' R
) T7 W1 |% B+ y4 |7 R- typedef struct {+ k$ k. p& ]. D3 q5 H3 B, A
- u16 port;
: R0 N6 A7 h" k - u8 cnt;" U* y. G% J$ S) x$ g& [3 {* B
- u8 rvd;
5 q# y* D4 o' t5 H7 G - } server_parm_s;
3 O- E5 S$ |1 X/ s3 d P
- I7 }8 Z, V# F, k4 O a- void create_tcp_task(void* pram) {5 o8 u$ B+ g# Y3 D5 u: ]$ {4 J
- server_parm_s parm;; ]' {- I0 z2 c1 g' Q! j. {* r
- memcpy(&parm, &pram, 4);
* i# H) R/ m; y7 t" o9 o2 U - WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);
, y) p) ?* v" O1 e: }: O' P: ` - int listenfd, connfd;
/ U" N1 R+ X5 m5 z6 \; }& m - struct sockaddr_in servaddr;
, l( y' @- e# N8 _8 |$ u+ Q - struct sockaddr client_addr;
! i' j4 T' {+ E- J
$ R# w; K f }: j/ R( Z+ L- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
+ |- i4 _$ P" f - {
% f; B- i; G/ e# \9 W, e - WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);2 ~: A( B; N: n; M% S! Z
- while(1);/ L9 c8 [- S( Z- C' ~
- }
' o; @6 Q b# g2 m% M5 o1 S - memset(&servaddr, 0, sizeof(servaddr)); ' \2 ]- i+ ~; J2 R m% p5 a3 e
- servaddr.sin_family = AF_INET;
' A; y7 i. `7 u: t - servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
6 [0 C7 R$ R# h5 E; |) P* X - servaddr.sin_port = htons(parm.port);
6 X7 A1 o9 D! a, ~. Q - $ k J C* v# f! T3 {" E! R
- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)- A9 q: M1 @* W1 ?. ^ S7 U
- { * i7 M& [" W' r) s
- WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);) a5 d0 _* V; a3 N c$ J3 o! n2 ?
- while(1);( u+ L* |" u0 H$ Z0 i+ A4 E
- }
- L& U% x0 N9 B3 H+ W$ @' ^. A! b8 ]% r - ' ?/ |8 `8 B1 D
- if( listen(listenfd, parm.cnt) == -1)
. ]- T6 b! H4 T% |4 _2 v+ a: C. b - { , q+ Y! Y) S: q- w* K1 E9 m
- WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
) u/ ~! q9 T% m. W$ M - }
$ Z, C. S7 |' Y+ G! A4 w2 R
4 [! i* t7 L, q {. ~ W- while(1)
3 m2 [# w& i w, I - { & F7 M+ |6 S- V6 S2 X
- socklen_t socklen = sizeof(client_addr);
- y: \) ~" G: k. z - memset(&client_addr, 0, sizeof(client_addr));
1 S' ~- f3 ^& a/ s - if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)1 V6 j/ H/ \" I
- {
1 ?# ]# C7 M, e6 ~2 g% f - WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno);
0 y3 ^: q/ Y) r; Z' _5 R - continue;
8 L0 `: K* k4 s$ ~/ h" _. G - }
6 K& K8 D8 ]* b8 R) |6 W" F0 ?' f# S1 _
# w/ i- x; L; H; i: j- client_info_s* client = sys_malloc(sizeof(client_info_s));* {/ @& Y8 Y& _- w# I
! c2 d' f6 H: y$ |$ g$ L$ v, a- if(client) {
! G6 g1 T& @$ e0 z0 k - client->client_info = *(struct sockaddr_in*)&client_addr;. W& ~7 }( Y$ h, M# G9 m
- client->id = connfd;, G$ V- C5 ?7 v5 U* B8 p$ B
- client->port = parm.port; |( D8 Z1 J6 e
- osThreadNew(client_proc,(void*)client, NULL);; g& v G/ O6 W5 W- r( d
- }
1 ^$ o/ z) h* W - 3 T7 D5 d6 q, y \
- }
0 ~% }1 d3 ]4 {5 t - }# V; W r3 w y4 e0 s4 ?
- / f* o8 U* E% E: p% V
- void create_tcp_server(u16 port, u16 cnt){7 \, o. V% M; Y2 O
- server_parm_s parm;
1 h/ L: f, j& F9 V - parm.port = port;
1 Q/ n, x5 P2 C) Q7 H0 S% A: _8 N - parm.cnt = cnt;2 X# O' s* p1 s
- u32* ptr =(u32*)&parm;" d2 p% J U' I$ @
- osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL);
; _% ?( F2 g& j6 R2 ?: I; S5 m - }
复制代码 3 X q) ]6 [6 [
非阻塞方式:
% R4 G0 w6 l5 c1 L
- n( y0 ?7 h$ U5 L% h, o- void trace_task(void *argument) {
7 O$ i1 K0 l7 |4 |( I) H1 k - const TickType_t xBlockTime = pdMS_TO_TICKS(50);/ p3 i4 b& b6 d1 D' O3 q3 N
- u8* read_buf = malloc(128);
' y8 h5 O3 D5 d; u4 v( B- g; B - WDBG("TCP SEVER port:%d", 1234);# k+ [$ n1 z9 a' _/ h s! u
- int listenfd = -1;
7 n/ l* m4 h2 A2 S* b$ U - int connfd = -1; 3 j. a: i1 b9 g
- struct sockaddr_in servaddr;
9 G; @9 y; Z% ?! d4 M6 A9 [ - struct sockaddr_in client_addr;
4 k7 ^" {" |8 [" k) ~; \, s - 5 v: X$ D: G' w6 j
- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )" U& s7 r4 \. p
- {
! j1 R5 E# l+ w6 e1 h" J - WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);* m# R4 i' }- n% H3 i0 J; d" k" Z
- while(1);
( a r: j: X6 A1 u7 B2 N5 m5 A8 f5 L - }
+ ?1 n- T6 \. I9 o3 ] - memset(&servaddr, 0, sizeof(servaddr)); 6 a7 S1 m G" w6 C+ x3 @
- servaddr.sin_family = AF_INET; . u4 B1 B- j8 f. t
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 8 [# L7 K% G; j9 ?1 o6 H
- servaddr.sin_port = htons(1234);
& O5 z+ A1 G \; ^3 w - 0 I" |7 p& o7 W& P( s
- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)) G3 i) x& h9 M7 {1 [9 m# T) J
- { ( }- F, n9 V& p" _( u
- WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
3 p% V" L7 d+ \9 U - while(1);
" ?& m% K4 F7 R2 v( \1 Y - }
9 x: N/ D; Q" R1 C/ E& T3 v - ' P: j- t% ~! a7 ]" L+ Z
- if( listen(listenfd, 3) == -1)6 w8 y- r( F7 e: l" G
- {
. G/ S' J4 `7 _; F4 A, N2 F - WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
* F2 @* | L+ I" e" L) o - } $ \2 R4 h) o6 {+ f$ x c: O0 a
5 p w# N9 N( Q' O# c/ Z- {
+ o: }( ~+ `) @9 j$ U - DWORD nMode = 1; % t+ \- V6 f/ l, d) m, K/ g
- ioctlsocket( listenfd, FIONBIO, &nMode );
9 x- w# D( B5 e4 H - }
: d o# g3 X, B& h! @$ B9 r - 5 u! P7 G' B1 \+ B
- fd_set fdRead;
) _) p. w3 ^9 A9 G7 v. W - fd_set fd_err; 4 W- r: H! E l; Z" L
- struct timeval tv; : k+ J+ b! n4 e0 A& N
- socklen_t socklen = sizeof(client_addr);
. o. `; w7 R5 W - memset(&client_addr, 0, sizeof(client_addr));4 g- p% L+ I+ a# f& j0 L. C
) c% R- O2 J7 c7 h; E$ ]- while(1) { , N, z* L) s) G3 y4 C
- FD_ZERO(&fdRead);, I) P. K w* X3 ]* {9 W! O4 E% a7 k
- FD_ZERO(&fd_err); : x- _) ?/ M7 k- q5 a9 Y$ ~
- FD_SET( listenfd, &fdRead); 4 M! D$ ^/ D( `' |9 W7 M4 A. O T
- u8 cnt = 2;& m( H, N5 @- ]5 N
- if(connfd != -1) {2 O- H7 H; q1 O" x9 a' h
- cnt++;
6 @+ P) ^+ L/ @3 P" H - FD_SET(connfd, &fdRead); 4 n; K' [. L/ l! N0 w
- FD_SET(connfd, &fd_err);* l' E, `" _# @, U* N% h
- }# `* n4 g2 e7 J9 f* b2 |* j1 e
- ! t( ~2 B3 T) d8 b
- if(connfd != -1) {3 w; b4 t) u. p+ \
- u32 rec_size = xStreamBufferReceive( g_trace_handle,
; _+ }, I& q% z# h$ Q/ ^. N: B - ( void * ) read_buf, 128, xBlockTime);
6 y. Y6 d; j2 ^7 [4 r# r - if(rec_size) {
2 t9 ], y4 G0 K! X/ D - s32 ret = send(connfd, read_buf, rec_size, 0);
4 |6 v7 i9 \& G0 K }9 B
& T3 y/ e6 y9 o( l5 p2 L# M- if(ret < 0) {5 w1 _7 [6 s M4 |' B& R& G4 z
- closesocket(connfd);
6 ~1 t* }: S+ w) a; a. k l - connfd = -1;
Z6 c7 V" F$ |' n5 H5 B - continue;9 T- ]; r' `! f- N
- }! ^) {( S. V! x
- }
% x' {) p3 [; n5 Q
6 Q0 B" w; S9 ^$ Q1 }! \* d- }* f% c1 G* S6 H& ]* S3 i4 R# `
- . f; b+ F' U" i& d- g
- tv.tv_sec = 0;
* h, }: P+ g$ @- J9 Y - tv.tv_usec = 20000;
6 }1 Y. A% S. l, p - s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);+ C1 ?! t6 B$ D$ K
1 B. j' D# }* x9 J( u9 l- if(ret == 0) {- n( x7 u3 d. i8 @! |4 n% M; w
- + G# Y! F+ \: b- E& o
- continue;" P, X" {% v7 f4 T
- }
; o! u- h% E3 l - 5 Z; j. `. b& [2 Q
- if(ret > 0) {1 Z; g8 C8 a# R8 S
- if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
' Q9 N) {0 p& m3 d) ? - connfd = -1;0 s0 ?7 W! D, i$ s
- continue;
( _9 V2 A# S/ S& I - } ' j2 r% [4 k3 d
- & `% N# j3 Q+ N6 m- k% G' G, M7 b
- if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.
# U2 w; A5 F/ k ?, q - ret = recv(connfd, read_buf, 128, 0); , o( L8 i1 J B1 Y( \& y2 J+ g
- if(ret < 0) {
7 @8 q9 o, |' h1 e8 \) l - closesocket(connfd);4 ~4 T) C y* {- B
- connfd = -1;; `; ?% L- u- e' p1 Z
- continue;" m4 {4 I" @* r
- } else if(ret >0) {3 Z* p& p6 |" w. S# G
- WDBG("rec size:%d", ret);
& i% L. f a" E/ `4 l) Z2 J/ ]. _ - }
% O& N) R4 a" I' \ - } $ }3 C; ] C# p
& }1 L4 h Y) w" z5 P- if(FD_ISSET(listenfd, &fdRead)) {# s, G0 A5 r& M! J" d* |
- s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);
7 T+ ^6 ?3 a$ q; S$ T5 ]4 x4 x - // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
" G$ s6 _1 m1 V; O R4 E
q% F1 e+ }* h" z8 {: z% a) s- if(connfd == -1) {
$ p% A+ G) d; A* X - connfd = temp;2 O% h! u6 e! D0 `3 j$ D* Y
- } else {
; x% Z/ u5 ?2 R* N - closesocket(temp);
4 U+ B# D' K# k' f6 a' R, Z$ V: P. t4 { - }
5 J& u3 i" R, _" p2 l. A; I) X! B - } % X) @4 l& t1 q& l0 ]% x
- }$ Q' t: N7 M, h2 y
- } ; I( N8 `: c2 C2 D% T" B
- #endif( b+ F* g- P# K7 l6 h( u
- }6 S1 O4 P( P% X0 b; w
+ x( A( B9 \. O/ U$ k$ D
复制代码
; j; A( t _! u7 l1 f/ I |