STM32F7 LWIP socket 创建TCP server5 F3 ?) B& d3 H
- typedef struct {. p9 @8 d% J: J8 V) Y" L- W
- struct sockaddr_in client_info;5 m% C. v: P( ~, N0 v+ i1 ~
- s32 id;
! L, ^2 r2 c, g2 q, ~' K& Q - u16 port;
2 O8 F; c1 H- A. S& d2 { - } client_info_s;1 k3 d% {0 U( b# o6 L
! c j- R: H& d/ ]) m4 W5 [- void client_proc(void* parm) {3 z5 u! _, N8 O0 i0 B
- client_info_s* info = (client_info_s*)parm;
6 f; N' |. F# b! ^' \ Q - u8* rec_data = sys_malloc(1500);
6 e+ h) G [$ R; u' i1 V
; K8 v/ Y" X$ o4 s: l; j- G: c- WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id,
9 S5 D0 X0 @; x - inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
( [" ^ w. w3 w1 J) D/ k2 k - # k J, F- \/ u: f
- while(1) {
% t/ Z( l7 s0 r( k4 B - s32 ret = read(info->id, rec_data, 1500);* e2 w( S' m4 C/ D x& `2 t
+ A; U! X' l3 i @- if(ret > 0) {% |8 F' L' t' p+ f
- WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);
- }8 n& r# g3 ^2 J. H - ret = write(info->id, rec_data, ret);
! \" y7 D y. G9 p* Z+ a1 R
' H$ e( i- Q2 l, r ^- if(ret < 0) {, \" b3 q! u5 d' W/ E6 n/ J
- WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id,
1 k0 g0 `# T% c2 O" L - inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);* R) [2 q7 i, x
- sys_free(rec_data);7 d0 e. Q- j& n# t1 [1 g
- osThreadExit();
, x% v( D) y& L - }
, P2 _0 F$ N" o/ T0 ?5 g - } else if(ret < 0 ) { i# b: F* k6 j% r
- WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id, W* G' Y3 d6 `0 l
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);) R2 D/ C( Q0 f7 d- H: L3 T
- close(info->id);
$ Z3 Q- p: S" c9 T, z8 n6 Q - sys_free(rec_data);: s4 n1 c& H; M
- osThreadExit();
" q, ]5 c* D8 i* u( x - } * L" [) z7 l4 L; P& i* c5 }
- }
, W" E2 x4 Y+ A" p( v - }; [+ T2 t& ?; {/ H7 K
( \5 @& B) ^7 o- typedef struct {$ ^1 Y& x; Z) F; t; n) U
- u16 port;# j) S ?9 ~ g- E. Z4 I" y2 |7 o
- u8 cnt;
" F; l0 _$ m+ T* {' } - u8 rvd;
" F0 D! b" x( y- k" s; I* W - } server_parm_s;, g5 Y1 m$ A1 R* y- ^* [
- s0 b/ V d) m
- void create_tcp_task(void* pram) {# W6 L1 A& y4 h% ~ \9 u
- server_parm_s parm;
+ @$ c) X. i2 y7 L - memcpy(&parm, &pram, 4);/ `& B4 q2 _- q+ B! Y
- WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);
) }( O* f4 {7 V( b0 | - int listenfd, connfd;
3 |# z6 T' R3 l( b - struct sockaddr_in servaddr;
) n, `7 M/ k x9 m' h8 H - struct sockaddr client_addr;% u5 k0 ?- }0 N
' j# w( E# z- I. E, g; u- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ): {7 Q1 F* c4 W; O" S! c
- { . m, z' l6 d* V$ ~' m# [% m
- WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
7 d; X }" j* c$ o) Y, E - while(1);, c6 k& ?! X: L4 a* U/ I* W; o' J
- } 2 Z( \, b$ z- f' E1 J
- memset(&servaddr, 0, sizeof(servaddr));
* S7 V. S5 M* u5 x1 | - servaddr.sin_family = AF_INET;
D* w# Z6 W y( J. G3 o$ J - servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 2 u3 q5 h4 e2 ]' H: E
- servaddr.sin_port = htons(parm.port); + Y% g; T. A+ I. \2 i
3 @2 w l6 ?& n) T I2 {- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)7 P* e) G4 J1 d9 v
- {
( \- [& c8 ~$ S - WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);" c" |# U! ~& T% c, D2 ~ U& U
- while(1);
, f& b8 t' x1 C0 Z) a# G - } 0 a4 y' c' Q8 H( ?6 ^
- 8 c2 r6 K/ b) |: w* Y: l" U. A7 V% x
- if( listen(listenfd, parm.cnt) == -1)
+ n# y) s& `6 l3 J, [' k - { 5 f) m' w1 m( r
- WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);* h& @/ ]. ~& O7 n" M
- }
, a& U5 d+ @! \8 G: n Z- l! o - 5 x1 r/ q, b! x+ D
- while(1)
C2 Q4 g# M( R+ L. A$ A - {
) l& h% D- t0 ~4 n" s - socklen_t socklen = sizeof(client_addr);7 k5 h1 K; D" ^- i
- memset(&client_addr, 0, sizeof(client_addr));6 X3 _3 p# y# U1 P9 x
- if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)
$ e6 r. `; Z2 n1 S/ t - {
$ R' @3 Q4 w- q5 m2 m - WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno); 9 ~! d6 w: i' ?) ~! G, f
- continue; 4 Y' G& R' ]" s
- }
( v3 ?. @: T% W) \ U2 m [
/ a7 s+ [, g* O0 T' v5 S- client_info_s* client = sys_malloc(sizeof(client_info_s));
! p& P) O$ r0 l2 \0 x0 H
* i t" x$ K* n" {4 L+ ^8 l" f- if(client) {
& S4 Q5 h, q' u9 i1 m- O - client->client_info = *(struct sockaddr_in*)&client_addr;0 P- m* N( k' b! C/ d
- client->id = connfd;" |# f9 K, N) c- H4 x$ C
- client->port = parm.port;
7 p1 e: s3 H8 z; D- r$ w5 l) H4 D - osThreadNew(client_proc,(void*)client, NULL);
8 M) A( L. m9 N8 ?3 h4 y, K$ Q - }4 j# d+ b0 ?7 A1 u, C# G8 f, ]+ y
' ]/ d% p- C T- }
! {! a% B5 f9 q) z4 ~' j - }0 |' _* `! A5 }: \
- 6 {/ f' \' l# T# w N2 x1 P
- void create_tcp_server(u16 port, u16 cnt){
# c3 F9 z: S. R: p$ e - server_parm_s parm;
5 L! i: r+ M& m- t1 @' v7 _ - parm.port = port;
. g! @" o# b, b- r5 F1 |- a# X - parm.cnt = cnt;/ i. M/ Y2 o: b6 g) k
- u32* ptr =(u32*)&parm;9 d$ w8 v( ^( I1 b
- osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL);
' ~, l, Z" e3 D" a - }
复制代码
" B) e, T2 Y6 W非阻塞方式:
1 D1 }5 P6 O- X7 |7 }
+ n. I% Q `: ~& Q+ h8 y- void trace_task(void *argument) { Z7 n+ K) A8 z. D- r
- const TickType_t xBlockTime = pdMS_TO_TICKS(50);
' v1 r5 ?/ J6 g - u8* read_buf = malloc(128);
) d! c# a; @; q" ]' y' H6 a - WDBG("TCP SEVER port:%d", 1234);
4 {0 t' f0 x$ w* f/ N - int listenfd = -1;
9 b) A, ?* \+ ~3 Q' x1 v, M* c - int connfd = -1;
/ n# D- s4 F, z2 n* F: G - struct sockaddr_in servaddr; & ], l; [, z4 ~
- struct sockaddr_in client_addr;2 `, H+ J) W; B- b6 F9 O8 O
" w6 L6 O% Y* p0 P6 T- _7 b- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ): h u% a, w: ~) q v
- { $ G" q8 F; t% w2 n. A" {9 g
- WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
# E4 R5 A6 s: }9 r: B6 z - while(1);+ F/ P) R/ q+ X& [/ ]
- }
) {: S# `& v6 d N - memset(&servaddr, 0, sizeof(servaddr));
2 V8 j6 G3 w5 M7 ^) i - servaddr.sin_family = AF_INET; $ a" N+ j) O1 o$ e* k9 Q
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + S9 ~# [3 n+ e* W/ N# A; ? i
- servaddr.sin_port = htons(1234); ' s0 L, [* H6 ]5 N$ ]4 o8 T1 p
h$ B$ p+ g- ]# e$ M- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1): ], e/ V8 T9 ]
- { 2 Q" a8 P& k1 v5 I
- WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
( }; o) T9 X o( r; M - while(1);
; J9 \* o( M- b. q; \) @ - }
2 W2 W( E% M; E4 Z1 T - 2 E# z) Y6 g, {4 g+ q _9 W
- if( listen(listenfd, 3) == -1)
" U- N9 p1 S0 \4 l* P4 o - {
- ?( J$ Q/ T9 N7 Q% X! v% ? - WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
! }% i# g: T K8 N" G8 g3 h - }
- f2 G: j; f8 Z4 q6 u, b; _
3 W9 O1 u+ N. M6 M- {
0 w4 o I- U' @+ a2 w1 m( x1 N - DWORD nMode = 1; S/ `" y& n' c0 c% m
- ioctlsocket( listenfd, FIONBIO, &nMode ); - `( R& L2 L7 w0 ~
- }. \" C7 s9 a! U
% T' x: e) p6 D- fd_set fdRead;
& O% K3 q# W' a - fd_set fd_err; 7 o! k0 R- k& X
- struct timeval tv;
1 X/ U: p% `3 j$ g - socklen_t socklen = sizeof(client_addr);6 d5 |" j% |' I2 [! P& \: J: l
- memset(&client_addr, 0, sizeof(client_addr));% B S# d. |) j4 Z& X
- 7 [# Y4 c* ~- p5 H. Z/ H/ G
- while(1) { # J- C% v: B5 C0 n$ X$ W- c
- FD_ZERO(&fdRead);
- L! q" U7 X f/ b- {) p - FD_ZERO(&fd_err);
3 N8 |! v6 Z+ }; s1 b; x - FD_SET( listenfd, &fdRead);
. Y# K: Z' b# w - u8 cnt = 2;
5 H, c% O9 i$ r! E/ V1 a1 Q) X D# m - if(connfd != -1) {( s0 |* K3 h. S9 I
- cnt++;
1 c& v* V$ B4 }' ~ c - FD_SET(connfd, &fdRead);
9 Y" X8 D9 q0 e( ` - FD_SET(connfd, &fd_err);
9 n Q5 |* E5 ~9 C P( ^; s- Z9 I7 F - }/ r& x, d' X( k% [
- ( S4 y- f( y3 i0 X
- if(connfd != -1) {
0 j: D% h/ m7 z, h2 y. _# o - u32 rec_size = xStreamBufferReceive( g_trace_handle,$ g( l( q! k" t
- ( void * ) read_buf, 128, xBlockTime);4 o7 O6 d, I6 c
- if(rec_size) {
7 ^- K- g0 t; k) b - s32 ret = send(connfd, read_buf, rec_size, 0);
1 S. F; D6 m8 {
) ?/ t- u7 t, _; U- if(ret < 0) {
; {4 q0 x' C' u; w' _ - closesocket(connfd);
7 U3 t0 {, S* g4 @8 P8 m - connfd = -1;# G# y4 C1 p/ f" m* x) M
- continue;
$ j1 b1 n; J. j4 W% G - }4 p4 z. k+ p- i9 C3 u9 U
- }: o6 L( k) W4 Z1 L+ w8 a9 K
- 4 g. x4 V# W1 I8 e- |8 ]- z
- }7 @0 k) T* Z' u8 @3 K8 T
- 1 a8 ~& G3 D$ m
- tv.tv_sec = 0;7 B) Q2 h- { s* N7 T$ U! k
- tv.tv_usec = 20000;* \% J, k4 ^9 f& |7 ?
- s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);
Y1 z' B9 F+ ]1 M3 |. I8 Z0 N1 ? - 3 z; G, u% A" ~ ^3 v8 Y1 Q. n
- if(ret == 0) {9 @/ n9 l& E: E" [+ ? l6 j- g
( B: `* {- c d; l: N1 c- continue;
) y- A$ i8 L" o6 E% W( n( ^ - }
4 j/ R; g9 n" r/ s0 f
. J% a! P8 K7 q' ?7 n+ g% Q( s- if(ret > 0) {& R4 f* T, n. T' q
- if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
7 W: D7 S" l' a& P' Q - connfd = -1;
2 N8 b$ k( I I) C7 w& K - continue;
* Y/ H6 H3 z1 m$ r4 e - } f" c0 V5 N" o* Z' T
2 T+ t; {, M9 l# t. _- if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.
( M7 A+ r! b2 n - ret = recv(connfd, read_buf, 128, 0);
) L j, L$ L$ o! ^/ t: @6 | - if(ret < 0) {, `, c; c, E4 q) |6 d
- closesocket(connfd);" Z: R9 g5 j+ O4 k0 k F
- connfd = -1;
$ X0 f* d4 x* B! I - continue;
6 I$ K; ^3 W5 [* L" r% s - } else if(ret >0) {: V2 O' Z' X# c" ]
- WDBG("rec size:%d", ret);
6 u! C7 I9 u2 M( u; ?$ d - }$ c% ?1 Q" D m5 D/ _; V' ]
- } - d" r, H7 q D3 @7 K
- + ?2 s9 T5 E% O% Q4 T; c$ {
- if(FD_ISSET(listenfd, &fdRead)) {2 c! \% J2 ~9 A. W4 a
- s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);
0 q0 i V$ B* V/ a% I( k9 { - // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); * |5 v5 o5 k1 O! o9 Z+ g1 F, B- g( F
- 2 T& A2 G$ |8 I, v
- if(connfd == -1) {' I% p$ q) }8 i2 s
- connfd = temp;" g( X2 k6 e( U) l9 ^/ Y- R1 m
- } else {
9 K2 \, K1 n' g; s7 X- Y - closesocket(temp);
- Z; j8 |2 p0 M& ~& c - }/ |- Y2 o- R# ?1 B8 q
- }
0 L& V6 x1 ~. o: l, J! c - }
) f; Z! ~6 ]0 h( B( W$ X - }
) d a' K" s* D0 c, u( @- g - #endif) [8 u/ ]9 G4 P8 v; b3 g
- }
5 h% ]0 a( C* K1 l8 f) o - # ?% [0 B ~, f' o- C2 e: X( D
复制代码
9 q# K" u5 M& w |