STM32F7 LWIP socket 创建TCP server& Z( l$ ?' W' f2 _# s; q6 z0 [9 Q
- typedef struct {
+ s9 |1 O1 k$ E) Q2 p' m" C( j - struct sockaddr_in client_info;
; }# s3 H4 p% J) F& b& E - s32 id;
; n% W+ i( l8 z0 c, ~ - u16 port;" J* |( y% r8 _7 m) f
- } client_info_s;
5 V3 X, F/ o3 ] - / O+ x) p2 _* J# W
- void client_proc(void* parm) {8 q# n4 X( g+ D- m. S! J
- client_info_s* info = (client_info_s*)parm;) f. i+ F6 Q, c- W9 c' k* C
- u8* rec_data = sys_malloc(1500);+ z& C L( `, E8 Q. W. L" v
% \0 \; y' `- H! c- WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id, + y/ Q7 B. W4 e& P9 h7 B$ X& i
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);8 x. E$ F$ p4 s$ y6 _
7 r/ Z. G+ W/ w+ ~- while(1) {4 j2 R% y- R8 q' h
- s32 ret = read(info->id, rec_data, 1500);* P# h* u: P K, @. |
+ Y! [+ Q1 r2 X6 R' }$ Y- if(ret > 0) {
! d: {0 D4 k0 ~; e - WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);$ ^: S6 X* P) G! y! D
- ret = write(info->id, rec_data, ret);9 s$ }9 \# B! E/ Q, `6 F
: K# q+ ^& s; M* S) F/ K- if(ret < 0) {
- M# `# ^) T: z" \' z - WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id,
. W1 d& C& ?9 k/ ~ - inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);# R4 K6 o, N h
- sys_free(rec_data);9 i, H" S" p3 m' J% f- H
- osThreadExit();
9 u7 I1 [5 |5 c- |) i5 o - }4 Y% ], \0 k- {; C' T* |4 g: |$ r
- } else if(ret < 0 ) {
3 g7 _! o+ K4 W3 [- y - WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id, {: G, Z }# ~7 U
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);8 Y" v0 f5 E: `2 K6 ^
- close(info->id);
6 Y- x- ~5 c$ r" v8 \ - sys_free(rec_data);
& e0 x G. Q/ @, w& h9 }: h - osThreadExit();/ Y7 e0 Y9 b* V' @7 O$ s2 T( k( Z% k
- }
. a* Z% [/ \* ^& E7 p: Z - }
/ _7 K; i" _! O: C* ] - }9 G. i7 d6 o+ f
- - v( f3 |: ~. s2 g% x* b7 h4 u
- typedef struct {/ ]# u O+ K2 h' n* p
- u16 port;
( C: R. M+ a: a. X3 X. n. O" d - u8 cnt;4 W: M0 d( r: Q H6 ]! W
- u8 rvd;) e& H0 |8 H+ c/ z" B3 S5 O
- } server_parm_s;, A7 n! z6 G2 i% j5 x5 ~
- - V" {5 k, ]7 x. J4 ~. Y) _8 T
- void create_tcp_task(void* pram) {, ]' Z7 w4 c" p# e/ V
- server_parm_s parm;
6 N0 q) m% Y) p) h" q( H$ Z - memcpy(&parm, &pram, 4);
* B' j/ Z h" ] - WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);
, U3 X9 R3 f% i& T9 P, [ - int listenfd, connfd;
- R" ^! w5 m x - struct sockaddr_in servaddr; ' y. J& j* ~8 D( ~
- struct sockaddr client_addr;
3 o. S/ ]4 r! l1 x5 w
3 R" E) ?% r E+ A0 r0 g9 E& V0 M- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
! `6 A8 r9 d! ~) y2 T1 N6 I$ e - { 6 E0 Y. R' p% l# ~. `6 r
- WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);2 y* U0 s! E4 p2 d
- while(1);# N7 L7 x! w# z4 F- x
- } 0 A' T7 X% s2 i6 ^$ b0 C* w
- memset(&servaddr, 0, sizeof(servaddr));
, M* M; o$ o1 u/ M( v - servaddr.sin_family = AF_INET;
& a: u( B- l! k - servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
, G! h: b6 w/ _, G9 M - servaddr.sin_port = htons(parm.port); + c6 K+ @& y( ~) e
- ' P8 V$ i$ t- D# z
- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
# }" }$ ^- B+ D7 m' H3 f' M ] - { 8 { K( A* o, s: m2 R
- WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
$ {' j- e1 u. U" k8 O! \! Z - while(1);6 g. ^! A6 y/ N- t$ d. i" p s
- } ; q& \9 X+ X& v8 T8 _
+ D4 t& ~5 O- s' F! i- if( listen(listenfd, parm.cnt) == -1)8 E& v' P8 q/ n0 ~7 Q. p S
- { * H7 J8 O( t8 j; ]
- WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
0 W# Z: N* o5 z! z- P9 t4 B - } ' _1 c* J" d& b- Y
6 s D& T4 M- I3 ]+ L- while(1)# x3 k. o# V, ~" q
- { . K! E) G. r% M0 d' q* x# x
- socklen_t socklen = sizeof(client_addr);
7 v! L$ v$ ?8 c. t0 u - memset(&client_addr, 0, sizeof(client_addr));& ]) d K7 u7 `* S6 N
- if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)4 [% h1 s U) R+ x: H" K7 i( t
- {
; p+ y7 A/ M- a: e - WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno);
+ D1 E H5 l( v' v+ D1 m v - continue; & k* X# W! }+ v, w
- }0 p& t, C6 T. {' Q
+ ^ {! b& t. @1 u- client_info_s* client = sys_malloc(sizeof(client_info_s));" u/ \& Y5 b5 Y; X
/ x. d# `+ m( ^! r8 |4 h! e, B7 A$ `% v- if(client) {, k; q" W' |# z" w# u9 q
- client->client_info = *(struct sockaddr_in*)&client_addr;
3 K$ R: C% |; ?9 f+ q - client->id = connfd;
) n: [5 ~7 x8 v2 E5 _ - client->port = parm.port;
0 ?3 Y' b+ _3 d: V4 ?9 e& |' C - osThreadNew(client_proc,(void*)client, NULL);
6 F; F+ b, e% b0 x) V* m - }. v, X$ k+ m6 d' c- j' ]
- ' c4 @) O2 |. y/ ~ C7 O
- } $ |8 w* F+ o( \0 {' B
- }- A9 @% u; j. H# K3 m6 i( R
- * I& K& M& I6 k/ n5 |
- void create_tcp_server(u16 port, u16 cnt){
7 X4 C$ H3 S0 i) x - server_parm_s parm; S0 | z/ @% q) @6 s' B' ~
- parm.port = port;
' Y! O$ g5 o& h2 W; J, C- E$ k' o - parm.cnt = cnt;1 K* k! V I* M; u& a1 q
- u32* ptr =(u32*)&parm;
: d2 A' D" N- D- N - osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL); ) F) T3 e$ W9 g$ B
- }
复制代码 6 Q- q5 @3 s* [/ a
非阻塞方式:1 x6 K/ P+ n/ h9 ]( c0 Q
2 t* i: g- ~9 H# s( O- void trace_task(void *argument) {
u8 I2 S3 O% ~) ~ - const TickType_t xBlockTime = pdMS_TO_TICKS(50);7 R( l# t' Q4 r) v
- u8* read_buf = malloc(128);9 x* a- W: n2 F9 m7 u5 L
- WDBG("TCP SEVER port:%d", 1234);( f: m4 K# p/ b
- int listenfd = -1;
3 t! _% n2 |' a0 b H - int connfd = -1;
, @+ ]/ I7 ?% V& J* H - struct sockaddr_in servaddr; ) I$ U: a9 k6 N0 V- d* B% j+ f
- struct sockaddr_in client_addr;
, n: }9 F% u( u- D2 Q
! C7 y# _! M8 m/ Y& l4 ~! Z, h% T- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )( L. ]8 _3 W( K0 Z$ Z& p' k" d
- {
+ u( f5 B& T1 k. G - WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
% D4 c1 g1 M7 h2 X - while(1);# y; o4 j" `1 m/ f/ u
- }
9 m$ l: S% F/ \0 j- S- z' h - memset(&servaddr, 0, sizeof(servaddr)); ) M3 G7 N3 i" @7 c, B" |- u
- servaddr.sin_family = AF_INET;
9 q+ R% T5 c$ P: q - servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
: l) B$ G6 X& W; [- i+ u7 b3 k- l* K - servaddr.sin_port = htons(1234);
. P, o! u$ f9 |. o - ; ]6 P5 K- T' @( ~
- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)( w. }% \: D/ i. ? c7 |' l/ W
- { : X9 P- P3 Z; J! y) d# ^
- WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
B- ~. x3 X" r9 I4 e. N - while(1);
$ k/ J. l. W9 T X! U5 N - } 2 ~ V& W, M9 B9 A0 t5 z* B
. S( B+ ^. G6 y: h& Q4 U- if( listen(listenfd, 3) == -1)
% ?8 h. x. S7 ]" E3 J - {
* m) `4 x% y* D2 X - WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
2 q& s9 l; Q t$ s; d6 C - } 8 x; v1 f- l8 ]$ H k! }
7 Z- w% z: V1 A. w- {
- D, X8 ~0 @6 I. R8 u1 I- Y - DWORD nMode = 1;
2 B. a' |8 j+ l- \( n - ioctlsocket( listenfd, FIONBIO, &nMode ); - {. A# q' T) l' Y/ i) I2 @
- }5 ]- n- r! x* {" P
- * j' w" v7 S: H' p
- fd_set fdRead; - ?' `: `: V3 w( ~. Q: Y4 p
- fd_set fd_err;
# I5 S9 |; ?" Y: U' t - struct timeval tv;
5 f. [; T5 @8 g5 w0 Y1 h& U' Y - socklen_t socklen = sizeof(client_addr);
* |# b# v+ N- Q& D, `' f - memset(&client_addr, 0, sizeof(client_addr));
) x, v0 e5 A: Z - ( V) B) D, E2 x7 f' n2 b; P" @
- while(1) { . b; U' x+ T7 v
- FD_ZERO(&fdRead);
: Q) Z) e/ J1 Z }/ i - FD_ZERO(&fd_err); * g; W6 ^7 Q1 G4 t4 s- x/ P
- FD_SET( listenfd, &fdRead); & W0 f8 N$ E: E
- u8 cnt = 2;
9 t2 ?) H' v8 R - if(connfd != -1) {
7 J- K' ~$ x5 N c4 h; W( A0 x8 b+ ^ - cnt++;3 x+ W1 W- ~, y
- FD_SET(connfd, &fdRead);
5 O1 U9 c9 B* d' w! G7 R( I3 S - FD_SET(connfd, &fd_err);8 B* t) L1 g8 D5 O
- }" ` z' q2 ?& ~% w' s" y! j
! J/ m, O" w) \; v0 O1 g/ j$ ]6 h- if(connfd != -1) {3 h$ U9 O' I# o6 B& \, V! q5 |
- u32 rec_size = xStreamBufferReceive( g_trace_handle,
+ G0 h) h; k" t/ a( Y$ d3 c4 N- [3 B - ( void * ) read_buf, 128, xBlockTime);
! \, `/ J- y i3 s - if(rec_size) {
+ z; T5 f4 H- [7 `) w - s32 ret = send(connfd, read_buf, rec_size, 0);
9 g3 ]. i2 a! Z8 ^0 K - & a% V' R$ b4 ~( x2 ~6 R* M
- if(ret < 0) { k A7 ~7 n* ^4 x
- closesocket(connfd);- D, m9 U9 l4 A m! I9 \0 x- y
- connfd = -1;2 F1 n' H% r- z3 L
- continue;
5 {9 n8 a1 i, ~6 B3 v - }% q( V" g6 {/ E
- }8 m X7 K& R0 U8 O; I8 e, S
- ; ]" w, i: i' t, `
- }, S; ~/ o8 X) }/ P3 x
- 6 G% h2 R: z3 X" B) ]
- tv.tv_sec = 0;+ D& m; U0 \( D* H, g
- tv.tv_usec = 20000;
# ^- S. G' A7 t: @, V - s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);* x: I3 o. G0 U( R( ?1 O
# H! O8 ]# y! E" ^7 K' c Y- if(ret == 0) {- f) h/ J, O/ @2 T
# n! O0 H* A$ \- continue;
8 @% w. P8 r x/ k' N8 _* k - }, r$ G$ u- M+ C% I7 m' B: t) L
- $ n4 S0 j7 x+ _1 X" P+ S
- if(ret > 0) {
! H7 M/ e5 N @' x( R9 |+ `0 H - if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.' h. G/ D7 m4 Q
- connfd = -1;
0 H) Q/ ~$ L+ B4 U, M, H& Y - continue;; x) O; ~& P( z& [! j; f2 D
- } $ c4 V& U7 Z2 j! k
- ! W6 @$ c4 T& \! V
- if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.0 @7 Q }& [, {8 @
- ret = recv(connfd, read_buf, 128, 0);
) i y( Y* Q4 Y/ w" e - if(ret < 0) {5 r7 r, [9 E9 A1 O. _ e* V: L& a, y( m
- closesocket(connfd);
' Q1 y+ }! b/ T* [7 W; |% | - connfd = -1;
7 E. @( T0 b, X3 ^1 {! R - continue;
. p# C( }' o$ C - } else if(ret >0) {
: H" ^; T+ z) J* b - WDBG("rec size:%d", ret); J" L& S' G% T2 b0 Q) K* @
- }
1 b4 h" @+ I8 B4 r1 N- z - }
# U: o9 e# v x - 4 ]# ^1 K* @3 M( A6 ?4 w1 [
- if(FD_ISSET(listenfd, &fdRead)) {
- H6 {4 C0 y* f m - s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);
0 d! C4 H. {$ o1 W k: r# q5 W, ^4 V5 i - // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); & G# b2 D7 r( }: P
/ [) f O% b! x: N3 M- if(connfd == -1) {5 C( g- l: Y9 h" Y
- connfd = temp;
1 G+ ^! Q( f. c+ s; L. K" j - } else {7 c E2 ~$ Q8 K' T
- closesocket(temp);
8 ^' H+ V7 g: Z5 o9 \" t - }+ T0 ?* m- I H* k2 n3 z
- } 9 N2 F$ F5 u. o* e4 \; h4 A
- }
' N9 c% f" [0 p; ~. Q B6 s - } b# y( O/ B0 U7 @& I) `/ H
- #endif
% g: R) J" f2 ?" i$ q/ Q' N( w - }0 D2 n5 ^' x( G
- # _' s. W3 A. y5 ?% C9 d# T
复制代码
U( s; M1 A8 S, | e* g @ |