STM32F7 LWIP socket 创建TCP server
8 m8 H0 W \5 }3 |- typedef struct {# ?+ Z2 @5 ^+ C2 G" ?" `; v A, p
- struct sockaddr_in client_info;
# ?( p0 M; B; n - s32 id;) [- T7 {- e# J% X L4 v! m2 e
- u16 port;
5 y* g2 }& _, [( `' _ - } client_info_s;
% N' ]& o: C3 U2 ^/ ~ - ?* c6 n' b2 T
- void client_proc(void* parm) {' C+ X; n% r! V9 L# M
- client_info_s* info = (client_info_s*)parm;6 B) d4 m( w$ T/ Q# X
- u8* rec_data = sys_malloc(1500);
7 X/ L; B" `1 |9 s2 P" t2 Q - , f. W/ a' V- v# y5 x
- WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id,
/ s& o! t+ j1 m - inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
3 C3 }1 n: t- k! e1 i, Q( I' z0 @
" T& Z/ N8 [! F- while(1) {
; |! ~/ b$ O# f1 s - s32 ret = read(info->id, rec_data, 1500);
) F. z6 U t( _" c( V - / B9 M: ^8 V& Z" V
- if(ret > 0) {8 u2 C5 n. R( B
- WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);
+ s+ L( @! U8 o( ^0 C& x( K+ ] - ret = write(info->id, rec_data, ret);
# Z' e( `" L8 ]4 h* {. F$ G" a# N
' P; [$ e* r8 u# X3 \- if(ret < 0) {: K- T# x9 ^" k7 t
- WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id, ( B) f5 n4 h$ u
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);" z: c8 c2 D6 `0 N( s% H
- sys_free(rec_data);. H8 a: x8 V' j/ a+ C
- osThreadExit();9 L) ?' S+ k- Z5 Q+ F
- }& e( `8 O9 ~! r+ A6 n
- } else if(ret < 0 ) {
t$ }( r0 B7 e0 j4 ~7 F - WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id, % L$ Z* q( i2 g) g
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
. s. e& O( T' r) r& [& ]5 F% b - close(info->id);
$ B- X+ ^6 d! h - sys_free(rec_data);
! `; X8 V) k- P9 q; J - osThreadExit();
. Y. W$ k# O2 l% [# ? y c% b - } 1 @7 M1 s8 M: W) r7 G; p
- }
# ^0 d. Q0 v; l* s - }
* u9 l( T4 V! _3 q: f/ r - : Q" r* p J1 T/ T9 L; X, R
- typedef struct {
# K. Q7 b' k$ e; g' J: B - u16 port;; ]2 m7 u1 @& f% S8 ]) j
- u8 cnt;
+ p1 n# ?! I" e( X/ W - u8 rvd;- W) m; z) i3 M9 ^2 G9 |
- } server_parm_s;# f/ W: {+ o, p- e. X
- 6 J, @1 _5 @! \/ {
- void create_tcp_task(void* pram) {8 x) A/ H9 s, v$ t
- server_parm_s parm;
% q5 c) c" {- s# {# ^) z2 | - memcpy(&parm, &pram, 4);/ V- d% G$ C; s' U& _; u
- WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);
0 q3 y5 o5 {! \8 a. W" l! z - int listenfd, connfd;
& R) p0 v# J/ e1 N" T" J - struct sockaddr_in servaddr; 4 h P( \7 {8 W4 D( V! {
- struct sockaddr client_addr;/ d( `& _6 F7 m3 u" }. `
- 7 h0 n0 ?( v) ?" O Y
- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
" L/ S4 ~7 W: b8 I% C' J - {
: O: N2 `( J4 B+ ` - WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);% P" `6 D. r" |% }$ }
- while(1);1 J T4 Y# y A7 L: s. P
- } 5 n2 H) R" w0 V3 E' P7 S
- memset(&servaddr, 0, sizeof(servaddr));
8 `, f! ]9 H: z/ _7 ?1 p, V - servaddr.sin_family = AF_INET;
2 Y( ?) K) e9 m9 e. R1 I& n - servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
( ]2 F! C( ?6 d! Y. r - servaddr.sin_port = htons(parm.port); + `8 Z# t% b+ ^2 h# v( @. ?& a1 E/ [
% _& `. ?( `3 R3 d- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
! M) z6 q. x+ j - {
0 c3 V4 N8 ~* G. d. v, k7 N - WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);, u% Z2 D& j8 d( @9 _: K" f/ d; h
- while(1);
" c" [6 Z* Y' Y7 [6 c - }
x9 W# O" N* @9 Y6 v
" k% n9 ?, _9 y" L0 i0 x6 L9 f- if( listen(listenfd, parm.cnt) == -1)
8 X2 f3 e1 b" y% Y - {
- @9 u+ j9 ~/ y( L! K: J" q - WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
6 n. e0 t" T# g% W2 G& \# k - } ; j" P6 A9 d; D
- - f! V5 U. `8 k: V- W3 J
- while(1)
3 M9 u8 M" T0 B6 ]! m) R - { " P- s/ H' m3 L2 v& y9 w
- socklen_t socklen = sizeof(client_addr);! m& `# Y; G3 ~: I0 }* D9 R
- memset(&client_addr, 0, sizeof(client_addr));' ^$ G6 K8 P8 Q+ @# J
- if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)
. h$ |9 \' ~% j( ^- O: U - {
, ]* x5 k8 h6 J: G - WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno);
+ c& Y/ X0 T1 v# j2 D/ P2 _8 \ - continue; u4 e3 e. [3 v9 w9 [6 o
- }
7 D' x6 Z0 @9 ` - W( d# ^, j; j. X; y2 Y; ^$ N1 o* q
- client_info_s* client = sys_malloc(sizeof(client_info_s));
7 h) W$ D& ]' v% ?) ? - ; O( L1 H% {2 B2 O0 @; @3 v, A. W. }
- if(client) {% L6 C% M( p) a/ X
- client->client_info = *(struct sockaddr_in*)&client_addr;4 ~! o0 H8 L( H7 d: S
- client->id = connfd;
) H- O/ h2 U7 ]- z' Y2 r+ f - client->port = parm.port;
/ h5 t6 {$ N$ I W& W; Z - osThreadNew(client_proc,(void*)client, NULL);
4 s$ t$ j; c# C: m* _ - }( Z! L, r% ~0 Y6 r0 {! A
- ) w) v9 r$ d8 ]9 w' y
- } 7 V: a6 ~% f8 _, V1 a
- }/ ]1 V8 t( b5 f
2 S+ x+ B7 p7 b4 w: d6 ?- void create_tcp_server(u16 port, u16 cnt){
; h; N& X' R- `' u- m - server_parm_s parm;
4 e0 W6 n: j9 t" \) n - parm.port = port;$ @2 r; @, {4 ^: J! |7 b& ~6 q7 e$ g
- parm.cnt = cnt;
2 i' q& @) ?; Q8 s - u32* ptr =(u32*)&parm;
+ ^3 r1 A% a4 c1 G# g" h - osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL); 5 X0 {4 p; H! r" P% \
- }
复制代码
* w4 A5 r* \8 D# f非阻塞方式:! X; U! j }2 z8 U6 u" @
% a* _: @+ ^2 B+ U, k
- void trace_task(void *argument) {
8 @1 D" [) {7 O7 l* N - const TickType_t xBlockTime = pdMS_TO_TICKS(50);7 ~4 }" b! v* @: R9 ?5 p F
- u8* read_buf = malloc(128);3 U5 i: Z5 P! Y# q- M3 ~& H8 ~% c; W
- WDBG("TCP SEVER port:%d", 1234);
! b4 C3 P. \* _ f, ^9 w - int listenfd = -1;; i+ {! u) U( W3 ]3 @! w* p
- int connfd = -1; ) G0 h! U# r1 {
- struct sockaddr_in servaddr;
, O6 M1 Z+ X' [" Z! x- t3 T. z - struct sockaddr_in client_addr;# e/ f, _# m, L2 L* C
7 ]: H0 j u4 }4 Z- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )+ y' ?0 u5 |7 [: \* A% r* I/ ]- r
- {
" P+ M' S% L6 k* C/ S - WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);9 Q: k' s, G- x
- while(1);- k' Q/ a3 [. {( ?" F3 e, J( [
- }
1 H( o6 Z* R+ f3 h+ G4 u - memset(&servaddr, 0, sizeof(servaddr)); 8 v! Y: v. b3 ?# t% z0 }& O' u
- servaddr.sin_family = AF_INET; % Q2 F7 h+ K1 [+ L
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 0 R7 C" \! p* A
- servaddr.sin_port = htons(1234); % H; g( x0 u! w. M# \/ Q
- ( m4 |! d2 H4 z# ]% U4 ^; w$ ~
- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
5 d* ?& W5 ]; F+ q) ^ - { ; k; w; C0 D# I& f# B: [
- WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);( H, i; f7 O' q
- while(1);9 e9 {6 B9 j- G+ L7 N1 D( O
- }
: \% T3 l- B8 [8 \) ]; o
) [3 P8 A+ _4 B' f* D- if( listen(listenfd, 3) == -1)( L# m% B4 _) v0 p
- { 9 G% h; @5 I' @
- WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
$ r' ^ R( ~4 c2 ` - }
3 Q1 }/ X( Q4 |' A8 e
* V' y! w# g! K, M- {
4 z0 X; r5 I) s% t. B8 b. l9 m - DWORD nMode = 1; & @' x1 S1 x; p5 { f0 y- O9 x O5 {, T0 X
- ioctlsocket( listenfd, FIONBIO, &nMode ); 4 t2 d/ Z# f& d% A1 I" B
- }
( J- v* N/ E3 U+ p' D - ! o& y. W4 D/ J& R; r
- fd_set fdRead; 7 c5 g7 R" V) h8 v2 M$ C4 p
- fd_set fd_err;
$ T3 _. ?6 I, @/ k2 ` - struct timeval tv;
5 ?0 B4 ?: V H/ [& _; N - socklen_t socklen = sizeof(client_addr);- w/ C8 T7 `3 d+ K% A B& O* c' X
- memset(&client_addr, 0, sizeof(client_addr));
% q! R9 _0 Y: R
: X/ B6 u4 o7 D; q& G' ?# p- while(1) {
2 J/ v/ j5 {$ H6 {& N! C5 s - FD_ZERO(&fdRead);
% ?* U. s* H7 L- K - FD_ZERO(&fd_err); % H* [$ s$ P8 l
- FD_SET( listenfd, &fdRead);
! K, s5 \6 l+ u& \4 ` - u8 cnt = 2;; |% s! C/ e1 H6 t" G
- if(connfd != -1) {
3 x# V+ \/ Y, Z' {; y# V% z' j+ k - cnt++;
2 z+ h. h5 ]. Y - FD_SET(connfd, &fdRead); 4 X; X P! E( t& P
- FD_SET(connfd, &fd_err);
: M- K ?. d3 k( k6 U6 f1 } - }
: @; m- T. R7 X0 p" }
- P) K" d# F# A4 D. ^3 M- if(connfd != -1) {2 o. ]7 E4 r! C, w
- u32 rec_size = xStreamBufferReceive( g_trace_handle,
# d, D! f6 n' B+ c2 }8 p2 g - ( void * ) read_buf, 128, xBlockTime);* a% d; w6 m2 N/ X, C
- if(rec_size) {5 P7 C) b6 |: X: a; }( }* M- M: j) c
- s32 ret = send(connfd, read_buf, rec_size, 0);
4 f0 r5 F& C5 ~& |2 S9 i2 y( U
- j. s! \2 Z' _- if(ret < 0) {, p3 ~- g0 ~( C# F# x! J
- closesocket(connfd);0 u- i2 _, k! q
- connfd = -1;
9 F/ e- T/ c1 j, S - continue; Z' u$ p2 J0 q+ m, g3 }
- } k, X2 T! O, U6 W* C4 S
- }7 y$ f: G4 m4 O! y9 l! ]
1 @# h& t+ V) p* R* @) D5 U- }
( X' T/ H9 L& {( j3 n/ F5 }2 o
- u( a1 ?. B, J2 n% P# u, C* @. [- tv.tv_sec = 0;9 d1 M" n- i# N) o( I8 V; r% T
- tv.tv_usec = 20000;
, }5 p9 q, @. ]& ?# B" L7 f - s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);
5 ^7 \ w( Z, N - a2 f+ l( [/ h& z
- if(ret == 0) {
* t1 A' N! e! [$ [7 m; e
2 @6 @1 c( ~' w# P# c- continue;
; Q6 O& j0 T/ @' M' d' J3 t2 d: Y4 i( a - }
: G) G5 @ T) a6 o
6 I3 k- C5 ~. e5 i- if(ret > 0) {$ ?2 S( l. B6 Z! ~' d5 m5 N0 U) s
- if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
/ E8 E! Q0 b3 Q X4 b1 x - connfd = -1;* T( r9 l9 s4 R0 K" @. ~
- continue;1 o1 A( h/ F% v
- }
9 n3 P& O" k* T5 O e - & T4 W% X/ _; o0 ]
- if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec.
" w0 D3 ^1 a4 O" S7 y. a( K: O; s - ret = recv(connfd, read_buf, 128, 0);
1 p* [ C4 L% c* P - if(ret < 0) {& f% Z2 ?: t# O( a
- closesocket(connfd);1 Q! s; c$ |1 l, p; i
- connfd = -1;
; z5 A Q1 c) w" [7 b! y& \ - continue;. E4 T9 _4 D) G
- } else if(ret >0) {( s& ]2 I* m6 w' n* Z4 d
- WDBG("rec size:%d", ret);( y4 c! Z, N ?5 ]2 K1 }
- }% W9 F5 _8 ]$ ~
- } . P$ h/ \! l5 w# N; y, k% A q
- ! c: w/ ?( R% f8 Q
- if(FD_ISSET(listenfd, &fdRead)) {6 b+ V+ P, Q. f- f; h* L) j
- s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);. Z( d8 e w" I2 }) Z$ {5 d5 y
- // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); " r0 h$ v x" G; P
2 [8 ]( ^: p& l. a% c- if(connfd == -1) {
. w8 \5 r, c7 j. V5 Z$ K/ e3 J - connfd = temp;0 \( d# C/ C* H$ E. p% w7 B
- } else {% O( p) O6 u& g
- closesocket(temp);$ X) `& n- l0 N: n/ Q$ N; q& `
- }
8 a. d$ K; @; R+ }! v/ s; m - } 6 U& T8 n8 G, G2 d
- }
# l+ H* D3 w& Q- s A3 F - }
+ |( n# `2 y0 G# v4 r+ } - #endif
; \! p: ^6 y" p+ X/ U - }
: ?- b3 D% T- y - 9 C/ U, v! k" O1 r
复制代码
6 B4 G$ v% a/ x2 l) u |