STM32F7 LWIP socket 创建TCP server
6 [% x. `, r# B/ o) J5 g+ l9 |- typedef struct {4 f- T# y0 |( L( A6 {7 R
- struct sockaddr_in client_info;, m/ N& j3 G7 T% u- t ^# G+ B
- s32 id;
6 }; u/ T) N" O, b - u16 port;
2 I! O0 O) I- t9 y, G% e2 a - } client_info_s;
! _1 f. Z% u# E2 V+ |" { - : K$ F, f" q2 a
- void client_proc(void* parm) {3 j: C1 J3 L/ P T4 I* W/ B8 C" s
- client_info_s* info = (client_info_s*)parm; Q9 ]. d, ] L* q$ {! B5 i. r
- u8* rec_data = sys_malloc(1500);. r; k- V0 q: l* E0 Q
0 v* M3 A" G$ Y6 `& A) p9 B- WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id, 0 u. x. t* l$ ^' \: g4 a$ E0 P
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);( y; [. a1 Q4 T
- 4 O+ y$ ~+ i$ g8 D+ v" S
- while(1) {
6 I' I) z% S, n' `. `9 h - s32 ret = read(info->id, rec_data, 1500);
/ R1 @+ z" g- s6 U+ X0 r' z
# N7 g! e7 R: B8 I- if(ret > 0) {
( `: d' o) Z3 o+ q - WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);: F" j* N. q, Z' G
- ret = write(info->id, rec_data, ret);( i5 x) K' k, z, h
- # M8 Q) M7 L, J/ r
- if(ret < 0) {
& ^. s4 J3 T3 p }; V% x/ r - WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id, ! E9 w& ~( C- s7 O
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);) c2 w/ ^5 c3 A/ W7 e1 d
- sys_free(rec_data);" c0 ^9 I; w9 w/ ^9 \+ ~
- osThreadExit();- a9 j5 r& n8 c* s
- }6 N& x/ b e# m( h B# x
- } else if(ret < 0 ) {2 u6 C6 `( z" r, y; [8 `0 ~
- WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id, 1 h, x/ c. k h
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);# O; c5 l1 V4 Z+ e
- close(info->id);+ T3 a: _9 Y# V6 G$ P5 D. b/ s
- sys_free(rec_data);, ?( f2 x9 D2 h5 x! v) V0 A
- osThreadExit();
3 U; I' D) @! L - }
' G4 ~- u# \) k5 ? - }( U4 G3 Q6 V. x" f8 c
- }6 H, {# N# ^+ Y
- + }/ F/ ~' i5 R0 V1 H" ?9 H
- typedef struct {/ h* a& S' s- d) V6 N5 P, h
- u16 port;' s4 R, E( _+ b5 z; ?
- u8 cnt;" @. ~& c4 n8 E: R
- u8 rvd;
2 }. [' p' R! z. l. ?5 ~4 o8 j* K, s - } server_parm_s;
/ v k1 T! m( W- y" {& a* j$ i
: v8 j( t; |% r( {, b- void create_tcp_task(void* pram) {+ d; p: }/ m* \) x! W: y
- server_parm_s parm;$ r" i% ~! X5 j0 h8 [, D9 y5 I
- memcpy(&parm, &pram, 4);
/ u1 B, G# p8 I" W# C7 f4 a6 ? - WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);& J6 V% v w2 `$ t
- int listenfd, connfd; # {$ o6 e* d) H1 B6 t- H0 P
- struct sockaddr_in servaddr;
9 Q, F- H( A Z - struct sockaddr client_addr;
, O1 s9 k! j4 d; v% P! w - 8 ?! d: `+ j& y% z M- f
- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )# P) W6 J# W- ]; Y m2 O! g; L
- { - V4 k2 |/ O1 @0 y) Q: v
- WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
- l4 Z: j9 f" n Q+ v - while(1);5 c; `8 i8 P/ J- a7 X4 L3 L
- }
+ g3 d$ b( c O! V: I& l - memset(&servaddr, 0, sizeof(servaddr)); 6 ^' A% _. ]3 }
- servaddr.sin_family = AF_INET;
* |9 [9 w9 N: h+ O: ]5 w3 B - servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
* ]" {6 n! _! n, K6 `4 l - servaddr.sin_port = htons(parm.port); 6 @. O$ N0 z5 C$ o. J$ c* j& Y/ @
7 H! v1 x0 y& o9 P E, T* ^- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)- e6 W& x* x# C& W5 g
- {
- e: ]) }3 v0 v - WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);2 Q6 H i: {& o$ O( P9 @
- while(1);6 i5 f% i3 C* g% X. x% l
- }
* x2 i8 F: n2 ~ - * n- F5 x* K8 i+ b `2 k9 p
- if( listen(listenfd, parm.cnt) == -1)8 _$ ^& p7 `/ ?/ [ c
- { 6 f, }" |& l& e6 u4 C
- WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
; l- D% a8 W# k" H9 i6 i. X - } - L" j0 P3 v. P7 o
- 8 a6 g9 [+ A4 P" L7 N' d9 Q. k' G
- while(1)0 e5 T1 G2 Y2 n* g; ?
- {
3 u2 \! R4 k7 F4 q - socklen_t socklen = sizeof(client_addr);, n1 X" i) S- b
- memset(&client_addr, 0, sizeof(client_addr));; a }) @6 Q+ }! p. }- j. m
- if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)
' G" B$ ?( {0 O - { 7 k* w6 Y; P6 M9 `6 A' n6 \6 K
- WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno); 3 W. `. K; C c1 m
- continue;
8 I) k# ?: B# N1 }6 e0 ]2 \, b - }7 e, ^6 r" }5 v8 s& }, V4 j4 W
- ' s4 l* ~& u3 Z4 F7 R3 }& R" D
- client_info_s* client = sys_malloc(sizeof(client_info_s));
$ ~3 ~0 x! m2 h1 D7 j9 k& }
. E2 R4 t: E& V- if(client) {
6 e B) t6 F3 N {3 ` - client->client_info = *(struct sockaddr_in*)&client_addr;
4 V9 G4 \3 a0 K9 }6 j& c - client->id = connfd;) @' D& h- [( L" R* d0 I
- client->port = parm.port;
G) B5 {7 s4 ` L# n; D - osThreadNew(client_proc,(void*)client, NULL);
$ E$ z! T9 q$ G0 [ - }+ Q5 @$ z' `- S- Y& f. g
- " l$ L9 i! ^2 c. h
- }
' D$ F d/ Z6 y( e9 C - }
' I, i8 B* c# v
$ x( e! n% j4 N" A i- void create_tcp_server(u16 port, u16 cnt){8 j7 X; T$ D. @: D; l
- server_parm_s parm;
6 X+ H( C. a2 U& E% B; @ - parm.port = port;
8 v) _3 i' N6 Q! e - parm.cnt = cnt;
) p I6 |6 e( x/ i& L( z. ` - u32* ptr =(u32*)&parm;0 m3 V6 }: G1 [; E/ v6 v7 Y
- osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL);
; N, T" f$ K1 Z! g - }
复制代码 % C Z% J; e0 E. @' M" ]9 l
非阻塞方式:
1 ~- |' y2 l- Q4 X8 N
. y- b: a3 B: ~$ j6 r" H- void trace_task(void *argument) {( S9 b5 V6 L4 F, P: G1 h% l
- const TickType_t xBlockTime = pdMS_TO_TICKS(50);* y1 j) q- [! G" ?; |
- u8* read_buf = malloc(128);# [* J: M8 `! V1 z! w$ n5 k, Y
- WDBG("TCP SEVER port:%d", 1234);
, w) N& R; u" K# ` - int listenfd = -1;# r) e& \# a/ k% s8 J
- int connfd = -1;
# I% \1 |" s5 V8 q" P) A - struct sockaddr_in servaddr;
, w$ o7 u/ g5 P/ T0 z4 R - struct sockaddr_in client_addr;
( O. b/ l. P8 s0 T% K9 r4 q: \2 Q0 A# M - W9 Q2 j4 z) }$ b+ Q
- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
$ n+ u3 w- D# s - {
1 D; h- K" l: z5 Q, D/ R8 E( I - WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);4 O$ a: M/ c* B$ ?
- while(1);
7 v! _# I- I' \7 a, x; N - } B, o; G* q3 v0 `# a, ?* a' e5 b
- memset(&servaddr, 0, sizeof(servaddr)); ( K4 ?0 p8 I3 N8 y" b5 d- v
- servaddr.sin_family = AF_INET; : F; X, `; I E0 i
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 9 {& H; z# j7 |, B' F- v- y% Y1 X
- servaddr.sin_port = htons(1234);
. L# ?0 h6 ~* X) H - ; m; e4 @& o, U8 n; Q! v
- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
4 U( O7 \0 H; B7 k0 Y/ z( t; N - {
, d1 b% _: k( l6 Q* v8 B- N( t - WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);! t! N7 }1 J. U' G
- while(1);
1 Q) u" F# E. d8 P( c+ Y - }
; ^9 I* a6 G0 O! f& S' l! m9 ^ - 5 X2 X- j. A& C! h% ?( X# g
- if( listen(listenfd, 3) == -1)
( ^4 Q% X3 T4 b - {
( {% z! g+ D! i! Y - WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
( z6 P1 n/ A Z; h4 |) Q5 N - } * x! r; v' p, t3 v* I, F! b, G# I- P
( V' k5 ?! D/ J( v3 A- {
8 Z" i' i0 E: y1 X" K$ N9 `3 u - DWORD nMode = 1; * Y' ?! d% R$ i( G8 R& }% o4 G
- ioctlsocket( listenfd, FIONBIO, &nMode );
8 s6 X% I; `7 M8 V; Z - }1 N! c( v1 j- p
- 3 G0 l. M- r6 L: C
- fd_set fdRead; + ^3 G( u! n3 k6 d& g! Z) ^
- fd_set fd_err;
8 a0 J, [; Q" d6 D+ p - struct timeval tv;
$ S5 q" S4 k* k% B" M7 \ - socklen_t socklen = sizeof(client_addr);
6 a3 N; e3 }1 K* Y' }0 m" n - memset(&client_addr, 0, sizeof(client_addr));$ t( \+ V4 F8 f3 @; }1 M
- 4 o4 X/ ]$ D7 g, g+ v; o
- while(1) { ) d/ V5 H7 P% f- \ w
- FD_ZERO(&fdRead);
$ X$ t: u) X, \4 \/ u7 X - FD_ZERO(&fd_err); $ d8 t) I8 a# \( }" @0 F; s- V
- FD_SET( listenfd, &fdRead); ) m6 k+ A! d# w, Z$ `
- u8 cnt = 2;
2 u8 K$ R( k. j+ c) i6 O - if(connfd != -1) {
. k# S0 g. X+ r% k+ ^1 V q1 M/ n - cnt++;
4 \3 T9 h0 ]0 S0 V - FD_SET(connfd, &fdRead); # p9 ~% |8 z" u/ o
- FD_SET(connfd, &fd_err);9 P, L9 }2 p# D& _" W0 w1 i8 r
- }
. p& Q2 H- L! w. |- y/ _/ H - ! M2 o' Y: O8 p4 D9 M5 Z3 H% x7 s
- if(connfd != -1) {
# B1 S' x+ S- a+ h# x& ?8 V# m) j - u32 rec_size = xStreamBufferReceive( g_trace_handle,
6 t3 a9 x: U( O0 n - ( void * ) read_buf, 128, xBlockTime);& O: h+ D& V/ a/ i6 \1 U0 a
- if(rec_size) {
7 s6 j8 X( x8 R/ ~4 s! j - s32 ret = send(connfd, read_buf, rec_size, 0);
! D8 B7 L+ w2 N7 {7 ?2 h9 L - # g- N; l, R+ p+ o# F. [
- if(ret < 0) {. ]( ^/ ^) |! V: h9 u! C
- closesocket(connfd);
* z5 i8 ]. ?& W - connfd = -1;3 O8 z& E/ e* F& N
- continue;5 F, J8 }& u4 u( w S
- }
V0 n% Q6 \8 ` - }
% o1 o/ u" O2 R# f
: X% v) x& w) p. `% k& [- }( T8 _& Z7 a, {+ ?
- + c# y/ A3 I4 d' J u5 `6 }
- tv.tv_sec = 0;
9 Y% q5 B2 X! p8 q! ^ - tv.tv_usec = 20000;
( n. W9 ?3 d6 |) ? - s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);' `$ i* L1 }9 O) C3 F: m
- & k" k H) h, J1 c; D& q: D
- if(ret == 0) {' l% S* P1 p, X# d% P* P4 m" H
9 F# @& q" M7 Y: c- continue;% k% C5 p' R! l2 \
- }% k- v3 S2 y9 S% S4 D) r
- / N% t: [) C* R5 R) Q( A+ I
- if(ret > 0) {
1 ]/ M' n7 j) F& J3 |" h! U - if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
0 E& v; [& U, n) ?1 L - connfd = -1;
* j1 B: e" H" _ - continue;, i& v0 Y: @# k+ D/ g
- }
8 g5 I( H g. c. V K0 l4 k
* K& N8 C; S; w' q) ^% ~- if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.
! g& w& C f5 j! X2 k% q" C! Z# [5 I - ret = recv(connfd, read_buf, 128, 0); ; t6 y7 f; Q0 m+ Q, m
- if(ret < 0) {
- G6 L5 T$ H9 O/ g% |4 T( } - closesocket(connfd);- Q- m7 k7 N1 `/ L
- connfd = -1;: X8 H, S# U/ y0 c. H9 x3 `' ], s
- continue;
+ o1 T: W! N. j - } else if(ret >0) {
. [" y$ t4 U; ~. g9 r2 {# _, `; t, } - WDBG("rec size:%d", ret);8 [, Y/ f6 e, ~. U' C; Q
- }) j: ]6 F2 \) Y& `0 |: s" l
- }
; M; W3 @( O7 J) p/ L
* q7 Y) d' O5 G/ O3 v1 Z- if(FD_ISSET(listenfd, &fdRead)) {# u5 _9 h" }! ~. B' Q8 E
- s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);" A* T, a& y7 n# O
- // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); 8 z4 ?) ]9 u# G3 E
7 p/ Q8 a# x9 O! h; x9 q4 a- if(connfd == -1) {
# Q1 X- H3 D+ ^* h* z - connfd = temp; b1 b. {: }8 d
- } else {
7 `7 N' s+ U" S, ^# B8 E) ] - closesocket(temp);* I/ Y. d) X$ g! w* X
- }
* O' }/ j- b5 v - } 8 o# z. O; Q$ [8 w/ ?, H! x
- }* B# {% p, ?9 x1 j+ h
- } 4 Q: H6 _' w! z' c3 |5 F
- #endif
o+ e7 `0 D0 }: X. D - }
h! T0 N8 Z/ D$ B1 H2 Q1 b
6 h d! Z" B, ]+ _
复制代码 4 \, V) ?2 s: q8 z6 \6 N, e
|