STM32F7 LWIP socket 创建TCP server6 ~4 u, [$ }" o; S4 U; w' n: }
- typedef struct {4 I Q3 O3 S i) r8 |
- struct sockaddr_in client_info;4 l+ c9 r) [# C" C: ^
- s32 id;
l8 e0 P1 q1 R: j2 y5 f8 q- V8 {& I. J - u16 port;
6 V+ d3 s; N, M8 a. C - } client_info_s;; K/ x( _* v* b! c
- 1 ^' @% I0 b0 u+ e: M
- void client_proc(void* parm) {
7 I' I/ M' x' R6 V - client_info_s* info = (client_info_s*)parm;5 S1 v5 H. U6 X( B* Q4 K: K
- u8* rec_data = sys_malloc(1500);
! G/ j% I; M- a" V1 m" [2 g - $ p/ z$ v) P p: s. G% q1 h, `
- WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id, 4 f4 T6 R4 p4 s+ W: X
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
, P4 V9 ^7 N" H
% }3 C& M0 W3 s u9 @5 p. X2 r- while(1) {& @0 M! { {5 E7 v0 e
- s32 ret = read(info->id, rec_data, 1500);
# t6 r+ U( s5 v n% N w) \: c - 9 d+ y5 P4 b( Q2 ]8 G1 [+ _; D) p
- if(ret > 0) {
5 p. w7 w0 ]& B/ J* U6 d% ^: X - WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);0 C/ M# m5 e# `1 e/ c% l8 d
- ret = write(info->id, rec_data, ret);. K* f4 k8 j5 q$ m
! Z( W+ a7 f1 L7 L- if(ret < 0) {
* R. B; t1 w8 S+ h' ` - WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id,
! N: ?8 K, J( c9 E1 G E - inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
4 m- O$ i7 N* f3 e0 x* M - sys_free(rec_data);
* r, o2 v# S. Z; b8 |" C# I! p+ i - osThreadExit();6 u7 Q6 V {( R: e! v& w- Z2 W
- }
$ a5 h0 j" q0 R+ y. i! q7 V - } else if(ret < 0 ) {
- j8 L g1 [: \ L! f+ l - WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id, % b8 q# T+ Y% m. y& `5 b
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
, u+ [/ K2 S# J+ e x! @ - close(info->id);
: ?- U; d1 `2 e5 \ - sys_free(rec_data);) N+ Z/ J. m3 a7 @" y1 o
- osThreadExit();
! ~' [+ Y* d/ }" \6 D - } ( D4 M+ d* t1 Q
- }
4 x8 T. }0 ?3 i; x C: v2 T) N6 m - }/ `& J) H& M' k- K% C$ l7 b
# e" u) ~7 ~$ x- typedef struct {
\+ x j" H! E9 v- |5 U2 @( _( r, w: x - u16 port;3 R0 N+ w& V U* B# V2 C# x, y3 J
- u8 cnt;3 a* U m" g. h
- u8 rvd;
! y" Q& \. U: w7 R3 N - } server_parm_s;5 p# h" X9 }+ u6 w& T5 P4 ?1 T+ |
- 2 {5 B4 M0 T# t$ I2 Y. n
- void create_tcp_task(void* pram) {$ [% L8 Q# I" w
- server_parm_s parm;4 ?! @$ W7 K9 |" ~$ I0 |
- memcpy(&parm, &pram, 4);
; P" `& {0 u0 I+ F, Y# r0 v, j, X - WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);- r8 |4 ~) M4 m: q# z( o1 Q+ {
- int listenfd, connfd; * T8 Z- C1 j* t3 J6 y
- struct sockaddr_in servaddr; * L L- Q# q" r0 q9 S
- struct sockaddr client_addr;, Q+ }4 @) Y& ] L/ O' E5 b
- 4 C# v# C4 t2 q+ w! `6 [
- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ), G+ o. g* y" \$ Y& @" k9 a
- {
# Q, h1 e; _ G3 i. R- ~4 G - WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
% d5 o5 Y. r2 p$ y - while(1);) ] F) |* I6 M2 T& J7 Q8 Y
- } $ {( v, \1 b$ I: B! V
- memset(&servaddr, 0, sizeof(servaddr));
- i. z3 ~9 Y; K2 q4 P: E+ Q - servaddr.sin_family = AF_INET;
6 {! d+ F# g7 a1 V6 ?. x - servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 2 [# l$ |* {. n2 Z( J4 w$ |4 D8 D
- servaddr.sin_port = htons(parm.port);
! b' J7 {. K1 V
; i* t" H* @9 Z- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
! y! G! Y) l" E+ k& C2 [ - { 9 C* O7 M( W( Y( B
- WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);) P% U* {4 L4 e. F' ~- ^: [; C
- while(1);" e) V! H( D q5 x
- } , u8 o7 v/ P- J; W
- $ j1 G& g' a5 U$ e. y3 R
- if( listen(listenfd, parm.cnt) == -1)
& F$ t7 c% v8 c% O* L8 s - { [: V/ r+ u1 y) R
- WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
}+ t7 A- k6 n - } % r, `5 w" Y" z0 v) N+ `
, u9 I. T# U/ E2 A: G- while(1). c+ w# D3 q0 b6 Q* w; L! N; Q
- { " }. L! N& w# ^9 z+ E" S
- socklen_t socklen = sizeof(client_addr);
' g# Y9 I5 K! ^2 i; }* f* s5 G - memset(&client_addr, 0, sizeof(client_addr));
; V$ ~- X: H. g3 d9 u4 p7 e- o - if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)
/ u- g& j' g/ W% b- y - { * ?5 F! P- A: D3 \0 k3 k+ T- d& u/ W
- WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno); 0 \6 \; `9 B0 t* R
- continue; $ B' E+ U% H$ t" Z* r
- }/ I5 x" j0 V0 i( t/ U- K2 ]
- 9 T, b6 Y& ~! q; |" v
- client_info_s* client = sys_malloc(sizeof(client_info_s));0 v% ?- X' |5 M J+ i
- $ p# \$ u+ b. k" R
- if(client) {
' }* z" Y8 q% {4 a* n7 z. h - client->client_info = *(struct sockaddr_in*)&client_addr;- k2 o6 A& o% u5 h0 Z }
- client->id = connfd;
( W6 H* o/ L: c% k5 _1 h5 H9 F8 a - client->port = parm.port;6 V( R# e6 K! w. p1 x( y% y. J& {0 M
- osThreadNew(client_proc,(void*)client, NULL);( C+ w, Y1 f9 g
- }
! G4 l# E7 Y7 e$ K3 ~! r! q
# L3 E9 ?$ \8 O5 u/ g! P- }
0 y' t- L5 t8 Y: M3 `- W - }% @* Y( o) |2 ]: Y
- B' ^9 B- l1 B+ E
- void create_tcp_server(u16 port, u16 cnt){
2 ~( R* k6 p/ b3 Z7 p - server_parm_s parm;
" L' {7 {; i M - parm.port = port;, ?; L5 a1 \0 a/ e$ Q4 E
- parm.cnt = cnt;
4 K9 |% {( F c- F - u32* ptr =(u32*)&parm;
- S4 c9 C9 {8 U- _- s - osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL);
- d/ Y7 S4 t D. @2 h$ a4 L8 c/ I- p - }
复制代码 7 a7 C+ U% |) C1 @, A; \; R
非阻塞方式:
" ]1 J2 e# Q b! @3 h$ V5 K
7 g0 z" p5 e. K X0 y5 X- void trace_task(void *argument) {
7 T2 S* Y1 J1 a* t9 S C- b - const TickType_t xBlockTime = pdMS_TO_TICKS(50); ]$ w8 r' ^: e% k4 I
- u8* read_buf = malloc(128);; K9 i- p$ X# o7 t @
- WDBG("TCP SEVER port:%d", 1234);
% _1 S5 c0 @: N - int listenfd = -1;
5 R9 }; U" x9 }( Y - int connfd = -1; ' D+ J# j" M7 W N7 q# e
- struct sockaddr_in servaddr; + w" D; v" Y N
- struct sockaddr_in client_addr;$ h4 s2 u% r% B# U; T N3 u |
- ) g/ q) G9 A( L8 [% J5 Y4 K/ _
- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )# K- P- z1 s: z4 j# b; O+ @
- { " l, `+ g: h/ C, l2 p
- WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);& H- _* J, P, n( ]$ q/ W% A9 I
- while(1);
' |9 V1 v& B% ?$ B - } ) z- P. _2 W- L- Z: m: |$ A
- memset(&servaddr, 0, sizeof(servaddr));
1 a$ [0 h' |+ C# z/ s - servaddr.sin_family = AF_INET;
% l2 A/ p. p+ N2 S2 v& u - servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- o3 V% ]( r3 R4 v - servaddr.sin_port = htons(1234); 6 b5 n$ ?8 N$ g4 l3 I! p
- & T! P& V$ m& u
- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)/ }0 _4 o4 T$ \; Y( b7 v2 t f6 O
- {
5 O- F# T3 o; a7 }5 x, y: [ - WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
/ J0 q6 u- z- l+ c0 X6 Q i - while(1);
( n0 S H% \: _0 a- u2 T" n - } / c; v) \ j' ~5 |% J8 s
- + f4 \$ c- v& x7 i9 x
- if( listen(listenfd, 3) == -1). _" D, n F$ I
- {
' K: A# y1 A+ J. Z& K e& e7 } - WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
1 y- ?9 N( e% V3 f4 U8 q - } 1 M1 u7 a+ d: N3 v+ S, @
- 0 M9 ~( e! i6 R7 W
- {
+ p- x' S9 \# D2 j. q - DWORD nMode = 1;
0 [4 n/ V1 x! T& I4 ]# J0 Q! g - ioctlsocket( listenfd, FIONBIO, &nMode );
s& Z Q* R9 D - }
$ c' X% |- s, \7 L - - I( d z* ^' {) ]" v' S0 |
- fd_set fdRead;
; {2 u7 ~" Z$ b* v, ^# `; A - fd_set fd_err; 0 N) C# W/ E( e: A+ v
- struct timeval tv;
- Z. Q( L0 P8 P3 ?* v6 J - socklen_t socklen = sizeof(client_addr); w& Y& Q7 e% ^/ t6 {7 f7 X6 {
- memset(&client_addr, 0, sizeof(client_addr));) r( K# w8 @7 d s6 X
8 H- @% h: [8 d% i: Q; d. [- while(1) {
9 L W( ?8 ~0 P( E( ]( b - FD_ZERO(&fdRead);
. C: E! t5 e+ u8 e3 Z9 \+ W - FD_ZERO(&fd_err); $ R/ t1 R: [! W% V l
- FD_SET( listenfd, &fdRead); 3 j& y+ H( f; o6 R* [; C
- u8 cnt = 2;
/ V) G7 f! C3 }9 _' H - if(connfd != -1) {
3 B) `/ b6 a+ ]" ?; v; k( y - cnt++;
: u1 G" f: x8 ]; V! ^ - FD_SET(connfd, &fdRead); " h/ ^* x! D) w
- FD_SET(connfd, &fd_err);
: L9 c) Q; g8 R5 U - }3 n) F2 X) M0 I) k# m4 e" ]6 A
9 B4 E3 I0 o! G9 N# b9 L, [1 V6 M0 i* E5 D, N- if(connfd != -1) {0 r+ F: @2 d0 ~9 o1 k: E
- u32 rec_size = xStreamBufferReceive( g_trace_handle,
( [. |& Z6 _( I* K5 B" F - ( void * ) read_buf, 128, xBlockTime);
" E: r& I# Z% i1 Z! L - if(rec_size) {
# s' n; ?& m: f1 T& X: t% @7 t - s32 ret = send(connfd, read_buf, rec_size, 0);0 L" Q, B3 K# u# D5 V
- ' K% u% H X& Q+ N* l! `3 a" \3 y$ z& h
- if(ret < 0) {' ], J" n) ^) ~5 S* D+ {$ [. @
- closesocket(connfd);
, P; w9 i2 y/ a( ~9 W - connfd = -1;
# Q# c; l* I- |6 m; h& ]) z* h - continue;$ k2 U) ]- T) m; J* D; ]6 T: d
- }. e2 R: n3 |9 s! }- d( t
- }
; h2 y( {7 M( } i# B4 Y1 N - 1 T* f' e# F9 a# N9 T/ A# D
- }4 \6 p0 c# h% S
7 p7 Y; R$ w `, |8 k$ J- tv.tv_sec = 0;
4 H( f( Q3 g: Z8 U$ g% i; ? - tv.tv_usec = 20000;+ N/ Q# O- L# M( `
- s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);) b5 ]9 I8 q, ~# \& Y5 J
- 3 I5 F* K7 w' e( L4 p @; r# Z
- if(ret == 0) {+ {( T6 V) j" F, O( w5 F
@' E% S/ P/ A/ v8 _* y! ?8 M- continue;% P, w8 x* m$ x9 z
- }2 i9 M- Z- B5 q8 B
1 a# G* a1 B, x; t! Y: m/ N* @1 H- if(ret > 0) {
5 J& b/ B' C6 p6 ` - if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
# {' |; W* Q j' Q9 K - connfd = -1;
: @# E) g! V' p! o) F7 `4 s1 }; O - continue;! @+ d5 R" h+ @% T6 ?4 y
- } 7 G' S8 [5 U d5 M" g& L
- H8 Z0 ]+ b, ^0 t. ~) u D1 }- if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.
2 N3 ]: ], P2 z% H - ret = recv(connfd, read_buf, 128, 0); 5 f; o$ k3 @. P0 V5 F
- if(ret < 0) {
8 |" S) z3 I) ~ - closesocket(connfd);
9 D4 t* R% ]2 X6 w# L) r - connfd = -1;
5 B4 G6 `. i) Q$ C: A0 \5 U; w - continue;& o, C. |& Z4 n4 g( V
- } else if(ret >0) {% ^" ^2 v- b# H& e5 u
- WDBG("rec size:%d", ret);3 y; E2 Y% S2 t- `- N& [# G" S9 X
- }5 [* S/ \8 K$ Z0 C
- } : ~' W+ t7 c; P- @7 D; ~
- - N1 g+ j3 V2 Y6 F7 n' G: l
- if(FD_ISSET(listenfd, &fdRead)) {
4 c+ P) h2 ?$ J- U$ k' u - s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);( Z% w' r! ^8 w( V$ N7 r! c
- // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); ( _4 C/ T; P& f# I* F3 `2 I5 W
- 4 ^3 C5 d/ H* G+ C- l
- if(connfd == -1) {; M& |; q7 S# i% W% _# ?
- connfd = temp;
5 k" S* V; T' v - } else {& L$ o# F' h5 P) Z. f% X5 a
- closesocket(temp);
9 s4 ~! P$ h; q# W9 U5 q& q- Y' f - }
% i# @' w) n- {2 ?/ f* N - }
! ]' R7 c1 v" W% ] g- J# m - }
' r& K& \; V" B6 s2 f - } 3 R4 M1 o) ^& N/ V7 o: J
- #endif' |- N6 O# f! e, \5 `/ c- i* ~
- }8 O% e: h& d2 _/ Q
, k% \1 l8 r4 J9 v, t
复制代码 2 b$ D* f7 q6 @ F+ ^9 _
|