STM32F7 LWIP socket 创建TCP server
7 \, G1 C7 J' q- typedef struct {' M( H! v: p" p% z9 ~# L9 S+ u
- struct sockaddr_in client_info;' |6 P5 Z2 X8 H; c( m D
- s32 id;
* a7 i3 K' F- Y9 u - u16 port;4 S# {+ U. p7 I
- } client_info_s;
2 Y9 g! M" r7 m% g0 }
4 [2 T) G' }* y, N: C' K- void client_proc(void* parm) {
6 n6 S5 G% a6 ]# ~# q4 k - client_info_s* info = (client_info_s*)parm;
[1 F9 C- C' B) m - u8* rec_data = sys_malloc(1500);! B1 k1 r( N; E' e
- . s. C ~1 u' M+ d) z
- WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id,
# @* k2 R" P* k; O, F! { - inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);) y8 p# b& V1 N7 Y; X2 m
- 5 Z( k3 S3 z: e: D* D
- while(1) {
0 k2 W- G& j8 T - s32 ret = read(info->id, rec_data, 1500);
3 _- y) V% |" \( q( f4 D - , t4 }5 A+ |. r# I, ?. P
- if(ret > 0) {! B1 {! }0 R$ c8 V) A: Q+ S
- WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);
H6 e" y, Z" T! }. M - ret = write(info->id, rec_data, ret);+ ]+ G+ N7 w+ _* X+ I& O
9 U$ a |" S8 J3 `: Y' u1 |# n5 w- if(ret < 0) {
6 W0 Z1 k' h/ E" F3 H. _ - WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id, + X1 @# ~9 Y- g' ]3 H
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);/ W' T" z1 G+ x9 q& {! x
- sys_free(rec_data);( z: O2 t4 |* A* t5 x
- osThreadExit();" s1 A V r+ y8 k* o
- }! v1 D Q5 _ K; n* ~
- } else if(ret < 0 ) {
/ \- Q6 }) o! }$ T - WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id, / I, P( u" q* _" @! C- P% e
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
. s L& ^" P3 s7 k0 \+ |* E - close(info->id);
# G1 [- X, o. e a0 A, V - sys_free(rec_data);
3 O& A% @3 I- R% b - osThreadExit();7 P; j2 D6 ~, l& M4 n. @ Y
- } , t. q" A/ v S
- }
V/ ?7 \" E- Q) N - }: Q) z. K" _. s
- : Z) Q# i% w& W! N
- typedef struct {. [3 ?- U Q3 E$ d9 P
- u16 port;
3 ^# w% U$ ?- M6 u6 y& x - u8 cnt;& e1 U4 S* w9 l* t4 U; N8 ^. O+ J
- u8 rvd;8 A f$ W( g/ ?1 N/ `
- } server_parm_s;1 o: U4 K( `! o1 m2 l
- 7 D" o. B4 K2 T( j8 B# Y1 u
- void create_tcp_task(void* pram) {, X' ]0 ?' l; W( |% i3 z
- server_parm_s parm;
8 t6 X7 x, H) [% h( { - memcpy(&parm, &pram, 4);
% [5 K8 S5 \7 J# |! j - WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);
; S7 g# R0 \7 j" f) a; H/ u$ I% v# y - int listenfd, connfd; $ P% b( V* j" X2 |" r+ `, Z! L
- struct sockaddr_in servaddr;
8 j- y/ }6 z0 e - struct sockaddr client_addr;
* k- D% s' y1 x. {; e/ w - $ \1 }: z% @7 ?$ m( D
- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )9 M* p M+ Y% c$ W% ~3 h; ^* C) k
- {
% C1 r1 r$ f% A - WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
( e3 y5 a' S* x- y1 s - while(1);
2 N. D; [6 o8 j3 ~: m5 @7 _ - }
; w! [: n+ f* [7 J - memset(&servaddr, 0, sizeof(servaddr));
9 M* z w0 q# j% X' }5 N. k - servaddr.sin_family = AF_INET;
0 w3 l4 W! |; b; @ - servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
8 ^) X' `5 m4 ^* m - servaddr.sin_port = htons(parm.port); . Y @* T' b% T' \9 Z
% u T0 ~% t1 Q- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)4 z7 G& d& i) J8 d
- {
9 e* R& e2 h! g% Y5 Y - WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);$ s, {0 y$ m4 `/ H" c! ?* X" J
- while(1);
7 s) u4 H& h" D* d" X - }
( F' n( C) [5 J, S6 @/ w% O& m - $ O/ r4 j& c. l* ` Q
- if( listen(listenfd, parm.cnt) == -1)
5 X! G4 S$ P) A; Q+ m7 { - {
0 M/ n3 ~7 e# J' b) g- L - WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);: a* e, ]- A- k( r$ u6 z" b
- } / E0 \( M: l1 D! E: | A
- " P: z- F+ [# r- _& V; `' r: ]
- while(1)) m- d' W5 `' I. z1 O
- {
6 w- ]: {( p3 T; i - socklen_t socklen = sizeof(client_addr);
: [) B/ y$ x' i# x% K9 h - memset(&client_addr, 0, sizeof(client_addr));+ M9 E( I6 |5 v, S
- if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)
9 |. r. M& d& Y) ]6 g- E - {
. D8 S. w+ C- @( t/ O - WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno);
# a+ Z& s. v- q+ a0 B7 l. B - continue; $ ]0 \' e* B" m9 q
- }2 I, Q( b% [- _
- " y5 X+ m8 j5 v3 g- n" L z
- client_info_s* client = sys_malloc(sizeof(client_info_s));
0 O0 a# o+ [/ @+ M* ?# e' K R - ( ]0 R& x3 B4 n/ V
- if(client) {
" H7 U0 w+ q3 F4 [ - client->client_info = *(struct sockaddr_in*)&client_addr;
; @1 z7 H8 I D6 B* b+ E - client->id = connfd;* h! S6 {9 `# l+ Q, f& v
- client->port = parm.port;
0 `! s( u8 n7 u& |, ~2 q- r - osThreadNew(client_proc,(void*)client, NULL);
6 p. _) m; G6 Y8 X1 O9 u - }
. d, \- {6 E: d: N: R( l6 D
* x7 A3 D: W$ [6 `- }
7 V' u# J% Z. y - }6 O9 }) k1 ~$ x2 O6 `6 J# R; l
- . P" B2 h7 k2 C: t8 H& c0 Z
- void create_tcp_server(u16 port, u16 cnt){
. C* m1 i# {7 V - server_parm_s parm;
* P0 I& f6 X8 W$ [) ^: A2 v8 | - parm.port = port;
* | \3 b. I; z, l - parm.cnt = cnt;
/ ]7 \! r) Q+ A/ G( H; O- h - u32* ptr =(u32*)&parm;
9 E% Q" A5 r7 ~3 O/ m$ O - osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL); 0 T4 |. \9 k4 J* A
- }
复制代码
4 a3 h, O1 e4 Q, o1 i. ^非阻塞方式:
* e; f/ ?) _3 V- r+ i. g. d
9 z) F3 O6 R+ t2 q! }" K: _- void trace_task(void *argument) {' u1 l) Q1 y( y2 j/ }1 k1 e, a
- const TickType_t xBlockTime = pdMS_TO_TICKS(50);. W& ?/ D) `! a7 G) @
- u8* read_buf = malloc(128);( U3 m: @1 z" V
- WDBG("TCP SEVER port:%d", 1234);# t/ @3 l% u* ^: L. ^( F
- int listenfd = -1;2 A" G3 ?' F! w* g" L& K2 B
- int connfd = -1; ! u0 z8 @# t, \
- struct sockaddr_in servaddr;
3 ~6 _- Q H! d7 T - struct sockaddr_in client_addr;
: F- z. e5 p- C5 i! Q+ l - ! f2 G2 s/ |6 {: s+ ~9 `9 v
- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
4 l3 H8 e" @6 g: \( b7 w - {
q7 a' ?( f1 D( q# o - WDBG("create socket error: %s(errno: %d)",strerror(errno),errno); G P& z: Q5 I0 p" e
- while(1);& `! X" T! U ^% J2 }: F
- } 8 o e9 N! w4 Y/ o/ y& g
- memset(&servaddr, 0, sizeof(servaddr)); - V& A7 s" S3 }+ d) X/ ^3 C
- servaddr.sin_family = AF_INET; ( W* D! s- s3 V: C6 h
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 6 G W6 k, v' P$ G, B/ x# j
- servaddr.sin_port = htons(1234); % t) I" T# z6 W+ C9 T
- 4 K0 w$ }+ H0 r
- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)9 h; w6 S) T7 n( a4 {2 K; B
- { 7 M; C4 v5 ]9 T" H. e
- WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
- |0 r; ]' V8 z1 P - while(1);8 `& ?" T8 q% D# V p
- }
5 n- I( A" ?* ~: m
5 I9 d& @' h& N$ k. ]- if( listen(listenfd, 3) == -1)# B+ @1 l" e: i4 m; `
- {
' |! C0 Y* B3 S+ U3 Q$ G - WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);4 F7 |4 O$ \3 J' r# y, d
- }
# ^ y& X2 k$ W: N - $ W" O( d2 ~/ }0 y- ^
- {
8 r- M; R. n" x$ z: `% k; E - DWORD nMode = 1; + \0 K: Q3 P4 m
- ioctlsocket( listenfd, FIONBIO, &nMode );
" Z K& z* y' v* G8 U - }
/ W$ T5 I& K8 @3 f% z {! B - + F) }$ X$ {4 l w3 X( H) |- t
- fd_set fdRead; % C; X+ V/ }9 y$ t9 e2 ~
- fd_set fd_err;
1 L7 L$ P# ^: Y+ d, c) A- D$ M - struct timeval tv;
m* S& s# N N - socklen_t socklen = sizeof(client_addr);( e& E2 t e/ I) g2 z- m! W' N
- memset(&client_addr, 0, sizeof(client_addr));
9 q0 s8 k8 P0 l4 ]0 R2 ?2 U( S - 3 e: [3 o- F+ E) j
- while(1) { ) ^' k6 k* J- i s/ `
- FD_ZERO(&fdRead);9 i% w$ }! F" F- ?4 K- g4 c
- FD_ZERO(&fd_err); / n9 ]6 m5 L7 T8 y, _3 G
- FD_SET( listenfd, &fdRead);
5 U" \* R; |* H( F - u8 cnt = 2;
9 Z' |' I# O9 B8 `9 L0 D. q* A) M - if(connfd != -1) { F1 C+ J! S3 \4 v) g
- cnt++;& H3 x5 h/ T$ ~" M
- FD_SET(connfd, &fdRead); 7 K8 f/ r/ W3 c+ e' f$ s
- FD_SET(connfd, &fd_err);
! @8 ^3 k/ n* u m: P. B: Y - }
1 ~% o5 `$ |) ^( y5 g
) F$ s9 l I: `" g- H! O7 Y$ ?- if(connfd != -1) {
( u: b& x- P4 w' h8 {$ n T - u32 rec_size = xStreamBufferReceive( g_trace_handle,) u U ~ U' s. G
- ( void * ) read_buf, 128, xBlockTime);6 q6 ?8 U3 U( m2 R
- if(rec_size) {
. m- \& t/ E+ H. b! w& h& A - s32 ret = send(connfd, read_buf, rec_size, 0);
; S* S& v# b( C$ V4 O4 j - 7 H# G5 w- B/ q9 ^7 B6 o
- if(ret < 0) {2 b# H. {" n7 P6 u2 ~' B+ `
- closesocket(connfd);
8 z \: j) ?0 P( I - connfd = -1;( H9 p- e/ V: t0 o
- continue;' i D* v7 W- ] _! G
- }
' X6 z2 z! x* k) M; x G - }
; K9 r3 x. E! T% o - : O2 _, g* j2 Q u( c0 D$ |
- }
" j+ t) ^! O8 C: q. @8 ^ - 0 V5 [! g1 Y' i1 E
- tv.tv_sec = 0;- Y6 N) a+ G! r' E$ h: O
- tv.tv_usec = 20000;
4 s3 A p! N8 X4 u8 U& ~ - s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);
( q$ R9 g. ~9 | - & F q* d$ V/ r7 {2 B4 E
- if(ret == 0) {4 C+ ?; m# g0 x* g
- ) b/ s; n# [$ p; x. J% ~
- continue;& P7 v' j/ L, |) I& U( j7 t, k
- }& m/ p$ o1 V( p
- . Q! T4 q8 Q5 [5 b3 i" q8 n
- if(ret > 0) {
; O! ]) @" |" O3 k - if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
. f o, t' q0 L2 x+ i8 ?0 } - connfd = -1;& I3 O% C7 Y" ` X% A6 V
- continue;. ?7 E E3 {; L6 [" T, q( W! c
- }
5 `+ b, B3 |0 \ H
* A0 x/ x. s+ L4 P& b, }- if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.
) ?) f( o% e' B) v* [ m - ret = recv(connfd, read_buf, 128, 0);
; A( v# O+ b! k$ w$ P5 f. O) z7 @0 q - if(ret < 0) {
7 H+ l# b% s, Q( f - closesocket(connfd);8 ^% p& B3 @, E) E2 Q8 I1 S$ T
- connfd = -1;
! V: @5 R, ~! K% Q9 `* U - continue;2 l* q7 ~5 l+ B1 l9 Z4 @7 h
- } else if(ret >0) {
0 \, ]: h5 C7 ^ s - WDBG("rec size:%d", ret);
3 D4 ^! U: ~# n, A - }4 T. E9 M# F2 h$ |
- }
; I5 X8 I- t) x1 ~ - 6 S& ]5 I5 t$ J) o% J
- if(FD_ISSET(listenfd, &fdRead)) {
- q+ j3 a' g. U( N% @7 m( _. E' T - s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);; M. z. C- R6 B) j. R x2 {3 n
- // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
5 R, X" H- i6 X+ h+ i" z" ~
8 F: W1 R, B( R# u |7 r/ j- if(connfd == -1) {) x6 I" d4 t$ p, U2 W2 J- m( j, N
- connfd = temp;
: {2 [3 c) k! g X6 g& r9 P - } else {
' t$ F% U9 O( y% t a - closesocket(temp);
0 n" z6 ?6 R% {: T8 F: D - }
6 j4 h% N4 g& X( } - } + }7 l9 H1 {3 h5 v8 m
- }$ M* I3 X9 f1 V" d
- } . m( R5 R- d/ y% n) |$ k
- #endif
, y. H4 @" t7 k: ?% P, y" N - }3 `4 n: h8 ^7 s+ P# ?% U
- . u' _9 S3 f' x
复制代码
4 N/ i& q0 _4 ~8 n5 ]7 R |