STM32F7 LWIP socket 创建TCP server
+ {, D. }8 H# w8 w- typedef struct {
" }( E o' H' W. p8 r) { _$ P# I - struct sockaddr_in client_info;2 D, G: g. O* ]7 K
- s32 id;
! p( Q. C" \$ T. q* Q) T/ Y$ v - u16 port;$ u5 L' I X7 Q/ y. M1 W
- } client_info_s;
4 l7 e, g0 X4 {, \( d9 `
3 R% v8 N7 J, w+ K2 L; o- void client_proc(void* parm) {/ S& t& N8 S* }" t; ]7 z: N
- client_info_s* info = (client_info_s*)parm;
4 ~8 |) ~# K- W" a2 R2 m$ H/ O, o8 B# f - u8* rec_data = sys_malloc(1500);
$ l4 i1 \) O- b C& h$ R5 y( l - 4 X- ~+ i' b: o: ~2 W
- WDBG("PORT:%d client[%d] %s:%d\n", info->port, info->id,
# U% c( P( _$ W# _" P" T% d - inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);
6 {8 T) i( {8 L* o; r
6 p( V1 n1 Y4 j5 p- while(1) {( b, u: q3 c# T) i; O: o8 x
- s32 ret = read(info->id, rec_data, 1500);/ e% p- h! N" l/ r2 S+ c
5 m/ @: m C! M& l0 W- if(ret > 0) {
{+ V1 \1 S: h" y# @! d" G( v - WDBG("PORT:%d rec[%d]:%d",info->port, info->id, ret);
/ a" h0 n# ^& e# V3 l - ret = write(info->id, rec_data, ret);
6 e! r( w+ R# V) ^8 U4 i2 _ g - ' T* D/ x% q6 ~5 v% Y2 o* }
- if(ret < 0) {/ G7 K+ _6 w% K# D, P
- WDBG("PORT:%d client[%d] write err:%s:%d",info->port, info->id, 8 P: p# C% Q! s; q
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);) l+ U" u, N6 k0 _
- sys_free(rec_data);8 C `* T6 I: D, l# k
- osThreadExit();) @) M3 w3 e9 d, `
- }
' n6 c/ U- O; r. _) Q I - } else if(ret < 0 ) {! S ~7 D7 \; Q3 v, f
- WDBG("PORT:%d client[%d] read err:%s:%d", info->port,info->id, 6 U, z8 [0 b5 U# c
- inet_ntoa(info->client_info.sin_addr), info->client_info.sin_port);5 n9 V; _6 F( m" Q
- close(info->id);
5 s% U7 T4 }* Z9 J8 u8 Z j* c. c" a - sys_free(rec_data);3 c* T+ m3 `8 h
- osThreadExit();( g5 [% Z: L7 V' ?
- } ( o& j) i6 Z" |
- }
V' g* `& r+ u8 A# u E - }
7 n; ]* S$ h p4 T) ^
% T m: a2 H! O) m! _4 b) e# V5 O+ J- typedef struct {
5 U" ]2 \3 W8 A1 j+ G - u16 port;. C$ Q- {, ^. k7 \0 ?
- u8 cnt;; m/ w$ A2 B. D0 v
- u8 rvd;* W# f5 g- L5 x! g
- } server_parm_s;# q2 h2 P; M4 C0 ^
; V3 |" W5 o$ B5 A' ^4 v9 z1 @- void create_tcp_task(void* pram) {
8 ?3 H# [) |: T9 {3 l8 V' k& y - server_parm_s parm;
, [9 h3 N9 n( o' M5 G - memcpy(&parm, &pram, 4);
; h( p' U% g; f; p: D: r$ B1 A - WDBG("TCP SEVER port:%d cnt:%d", parm.port, parm.cnt);
) \: A" ^" p6 k) @: h - int listenfd, connfd; - F( t4 R) @9 r) K8 _0 P9 |+ N0 }
- struct sockaddr_in servaddr;
: R$ ^* q6 ]8 `8 m. A) w0 N - struct sockaddr client_addr;
! w% l& n9 [: X5 H# \* k. }
% ~9 W: u \: Q+ t- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )) @. i+ j4 z# x- @0 O* F
- {
9 J0 M. O$ k5 d' M- e- {; N - WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
/ x. L) F* `# ]* ^/ D3 y - while(1);7 R/ D6 k; o# i* B
- } ) r; \2 e5 ?; [( g
- memset(&servaddr, 0, sizeof(servaddr)); ( ^) I0 k( M E/ K5 d" |7 Q) Q5 q- R
- servaddr.sin_family = AF_INET; : _* [* ^; N4 \1 C
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 2 v% C1 j* J# ~7 c4 G1 y9 e
- servaddr.sin_port = htons(parm.port); ( g; Y) n+ T+ Z7 i# I% I. j/ f$ U
, O, p6 H. b( O! D- X( J8 X- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
* `# ]+ {# i# J c/ j7 v/ `3 T% C - { 8 A/ C; f7 h1 U+ ]
- WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);
* U; m- J+ l* ?8 {. x - while(1);
. Y. B. B, v! k - } . v1 f- f* t8 j D9 \1 Y
E% K" O7 p% S0 u3 |- if( listen(listenfd, parm.cnt) == -1)/ u9 |* V7 J3 B. L: R4 K
- {
: B) U% ^0 J4 q$ s: H$ ^ - WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);
, L. S' Z$ ?" T, d" y7 T9 m - }
7 j* N+ _5 [: u4 q% K0 a
; G" o) p- E0 z& g8 I s- while(1)
0 i4 _: n; ~: Q; q2 k - { 6 Y7 g M# Q8 B6 H
- socklen_t socklen = sizeof(client_addr);
! t6 m* O9 X0 v% v9 g - memset(&client_addr, 0, sizeof(client_addr));$ { r" J# e$ {8 ~
- if( (connfd = accept(listenfd, (struct sockaddr*)&client_addr, &socklen)) == -1)5 V" A# f( [# z; I5 i4 u8 |# k
- { 1 H: F% ^5 E, W) p. [6 j# [' |
- WDBG("accept socket error: %s(errno: %d)",strerror(errno),errno);
# r! \: `: |& H- v1 }: r5 v - continue;
5 x6 c: e7 J3 N - }
# p4 ~* b7 d: ?
V- `" ~: h7 _+ R% k' E) U- client_info_s* client = sys_malloc(sizeof(client_info_s));7 G' a* x/ L# d9 M3 x
- : |" \7 J1 L9 c2 g- Q- t8 v
- if(client) {* W: t! V/ B! L* u% I
- client->client_info = *(struct sockaddr_in*)&client_addr;+ Y+ X; a) m+ l X7 w& ?
- client->id = connfd;( ?: k% }% C+ c$ F& [; ^+ J
- client->port = parm.port;% i0 a( z0 I( Z: _% `
- osThreadNew(client_proc,(void*)client, NULL);
- |% N# D' L: U2 r9 F, ]4 F - }
% _: e6 m6 H( y5 \; @ - 1 L$ X, N6 e; g% I5 h
- } $ p; x! t' Z5 u
- }
! D+ Y0 |+ ^: y1 g4 ?2 n5 S
4 Z( N7 S3 w0 K- void create_tcp_server(u16 port, u16 cnt){
" V8 t& N) w; z: i - server_parm_s parm;/ o) E5 E# k7 Y! u( {
- parm.port = port;
6 W: C* I' t; U; | - parm.cnt = cnt;
0 L! q e$ |2 j, y5 f9 d; C& h3 c2 W - u32* ptr =(u32*)&parm;
+ X/ R% z. ?# R4 z, p - osThreadNew(create_tcp_task,(void*)(ptr[0]), NULL); 7 J# M( {& \& _
- }
复制代码
2 P+ q% [9 Z3 c I/ C非阻塞方式:
( i8 j( d4 p( v; _( F/ C- |- }% b8 s1 Z5 f! w5 y
- void trace_task(void *argument) {. j8 W7 E3 O1 n1 Q0 ^5 p5 S3 D8 z( z0 w: `
- const TickType_t xBlockTime = pdMS_TO_TICKS(50);
8 h q, f5 P8 u0 E4 c) ` - u8* read_buf = malloc(128);( Y% V5 F/ y# v' a
- WDBG("TCP SEVER port:%d", 1234);
4 c1 i5 l! t7 M" a" N, A6 d - int listenfd = -1;
: ]. l) i" Q' a - int connfd = -1;
) Z9 c# V! D X i( }. S - struct sockaddr_in servaddr;
+ P9 K" J3 ?9 t- C0 s - struct sockaddr_in client_addr;7 j0 T8 D" @6 [4 E/ k: {, X
" L7 F" j7 z& V" h5 D; f& m- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )+ s3 O, E; I' ?! v
- { + D: S! v8 n0 `' L" ~
- WDBG("create socket error: %s(errno: %d)",strerror(errno),errno);
* j! s! H: C3 j, I* f6 _" S4 y% r - while(1);8 d5 e' Y" \3 S8 W& D, d2 Q: e
- }
, F+ D0 Q0 e. h1 y) _, m, \6 k - memset(&servaddr, 0, sizeof(servaddr)); ! |* A& w* B( k; t1 u
- servaddr.sin_family = AF_INET;
5 b" E, y' j% @9 Y1 S - servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
) h3 F0 D/ Z2 J# J9 R, i - servaddr.sin_port = htons(1234);
3 R2 j. ~. u7 ?) n: K O
; B* q! f3 O; l$ b- if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)* s! n# y: Y) A- v
- { 7 C+ p5 z7 q2 F ~
- WDBG("bind socket error: %s(errno: %d)",strerror(errno),errno);% B/ o: ^8 W7 B& ]% ~! \2 s1 y- F
- while(1);
# g- K: v5 h. ?3 s! }* { - } $ L, N) v4 ~2 y% i- h
' ]( v* m! V" u9 O% D9 x- if( listen(listenfd, 3) == -1)
, w& c) |4 B9 z8 |! J$ t7 o) E - {
! [' }% `+ s: M% D - WDBG("listen socket error: %s(errno: %d)",strerror(errno),errno);( R1 y4 _( z V8 Z! C ]
- } ' h5 z1 M F0 N5 k$ x! s
- 7 k9 ?6 q4 ]+ V h& A9 u
- {
" x( `2 @' B: U; i - DWORD nMode = 1; , y7 B1 D' h+ E) b' Q& [
- ioctlsocket( listenfd, FIONBIO, &nMode );
: F6 Q3 Q R+ w }9 m! E! z5 l2 V - }+ s* u1 o3 b$ v5 N: \3 m2 U* B% L. |
* M; {8 b! M4 p4 D. \" w* V% ~0 k, W- fd_set fdRead;
% h- M! T9 Z8 f: _ ^ - fd_set fd_err; 6 B. Z. }) ?! I# _8 P* Y8 s
- struct timeval tv;
% t: g3 b) O: q) f, C2 D - socklen_t socklen = sizeof(client_addr);
! c/ H) {) R, C3 W3 l! d$ c* W4 x - memset(&client_addr, 0, sizeof(client_addr));
* W& D0 j' B' T
5 T% |4 [! A6 l* U2 B- while(1) {
& f$ |! A' `: t4 @ - FD_ZERO(&fdRead);
: A& {7 F- l& x6 |" d F+ S - FD_ZERO(&fd_err);
2 [$ L7 E; B. H o( b) c; u& f - FD_SET( listenfd, &fdRead); * v6 @ w: [7 C5 E# I7 N
- u8 cnt = 2;; k; n* Z5 A# G) v" |2 l
- if(connfd != -1) {
9 m$ z; U) f0 [5 t6 g( [' L - cnt++;/ M! x6 w) M. ?$ |* i7 H( N
- FD_SET(connfd, &fdRead);
" }6 j- q& E# ^0 E6 c6 y( L0 X4 r! c - FD_SET(connfd, &fd_err);5 y* B8 a% f% k3 k* f
- }
+ o* A( K! N; q4 K4 a2 Z. W
3 e8 t J& K4 i }1 x3 z- if(connfd != -1) {1 g+ t0 K7 u* h: w0 s
- u32 rec_size = xStreamBufferReceive( g_trace_handle,
2 |* E! q9 L) k/ Z& x3 X% k* c - ( void * ) read_buf, 128, xBlockTime);
" n+ v8 r& Z A - if(rec_size) {
4 ^: N, u: ?9 ]9 k) z0 i - s32 ret = send(connfd, read_buf, rec_size, 0);$ o8 K" e- H( c) Q
- 0 k) z7 }/ ?' V
- if(ret < 0) {; e: n1 \/ F F3 [
- closesocket(connfd);3 r( g/ j" \ U6 H
- connfd = -1;$ h! t6 j2 o% R0 Q& A1 U
- continue;2 X9 G5 e! g4 _# ~% w
- }
. K1 }" f# g1 y- O* [ - }; F. h' t% Y! z2 _" _
- 4 ?9 U6 t" V) T: |, B$ K' A
- } ^/ [' a/ h9 C; q5 v* E
/ ^: S/ c+ i" h# V2 v3 u/ S- tv.tv_sec = 0;2 ]& J- |$ S2 U
- tv.tv_usec = 20000;
# H5 f" _' Z( J! Y0 X+ { - s32 ret = select(cnt, &fdRead, NULL, &fd_err, &tv);
2 p$ a2 S' f8 E; s8 f - 1 C F- s, g" C: @7 c B
- if(ret == 0) {) y4 Q) a! C8 K" |
! ]. I, \$ M4 i2 Z! P* r- continue;; T- E9 J- N& Y6 b2 z& i+ l
- }( G3 h% |8 L& z* F- g$ {
- 1 I5 R/ \) l! F* ~$ ]0 Y
- if(ret > 0) {* k: S1 j$ V* D) U$ I1 O1 b
- if(connfd != -1 && FD_ISSET(connfd, &fd_err)){//rec.
) y, S+ W& A9 z0 I; G% L - connfd = -1;# A' ~9 ]0 \6 y$ {( [. b
- continue;
- z8 y, z- @0 U/ u - }
& v" O* k9 d; o" F
8 {/ P- O) F( h A- if(connfd != -1 && FD_ISSET(connfd, &fdRead)){//rec. s H- m3 g! H/ l! B) C$ q
- ret = recv(connfd, read_buf, 128, 0); 4 b; V. |1 S2 g# P+ y& I
- if(ret < 0) {
6 ?- w# h2 o' c - closesocket(connfd);
" y# G6 y9 Q' p8 G/ q T% W1 M - connfd = -1;
( W# |# F8 D. Z( U" { b9 B - continue;1 i$ x v* v; |# q& B6 w$ Y
- } else if(ret >0) {
4 ?4 H' G% B) M' v0 v5 X - WDBG("rec size:%d", ret);; Y. T ?2 R4 [/ j- l
- }
, A/ i+ z5 c Y: Q' q. ? - } 9 m6 x3 r. {0 w. [( D- P f, E/ H
/ P5 I8 X5 D8 V, z ~; `& B4 o8 |- if(FD_ISSET(listenfd, &fdRead)) {1 i: m' w. ~ ^
- s32 temp = accept(listenfd, (struct sockaddr*)&client_addr, &socklen);
' g v Y& i6 h6 x - // WDBG("-client:[%d] %s:%dn", temp, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); : _5 r, p0 f5 c6 a, n4 Y, I7 R' A# P
& z! z1 d1 S# H% P- if(connfd == -1) {/ J8 d4 h3 I. `- ]+ u
- connfd = temp;; q2 Q, J8 U2 B. c* b$ T2 k
- } else {
1 y4 a" `) ~( ]; q7 K2 B! c: | - closesocket(temp);
! K; K* | t0 z0 g( @" x - }
" K% C$ m' P7 U0 F- t6 _* Y; @ - }
1 ~9 ]9 x$ Q+ M3 { - }
, Y7 Z Z+ ~- H/ _/ { - } 0 g( W# w6 R& [" J" N
- #endif
; a9 y" M& z& q! M" v$ w- r4 K - }
4 c* }! T" ]2 A' q9 e
' M/ |6 {" ]4 ~) v; q% @% c r
复制代码 " ~: c" D8 K1 t8 h9 b2 j- Q
|