发新话题
打印

【求助】linux网络编程问题(服务器与多客户端)

【求助】linux网络编程问题(服务器与多客户端)

:p :confused: 关于linux网络编程方面的一个问题:设计了一个服务端和客户端。客户端通过指定ip与服务器端建立连接,当有两个连接跟服务器连接时,服务器就新建一个进程,负责转发这两个客户端的会话(即服务器作为一个基站使用),现在有一个问题:当有两个客户端连接后,后发送数据的客户端总是无法发送数据,甚至连键盘输入的数据都检测不到。这是什么原因呢?
# @, E0 l5 l! B; k现在我把代码写下面:(附件中有代码)+ W5 \4 j% K  \3 q. s
, J9 i# v+ V$ ?& v

$ i3 |, L! m. [( w6 P9 Mclient.c3 U, t% D) k7 |2 {4 Z8 r. I  P* V. C
, d8 g6 A" O7 F! V; \' L) ^( `$ k: E
/*本程序模拟一个聊天工具*/" b2 X* C! q" m1 j3 |
/*运行client serverip*/
! s, ?3 Y- i, B) ^#include <stdio.h>6 R& B8 w& |, R0 d# @5 e
#include<sys/socket.h>
) Q& P% A- V- q) l* c#include<arpa/inet.h>  v: g( I+ Z) R1 [
#include<netinet/in.h>
. z8 b4 J) [$ X7 _: A, e/ G#include<errno.h>) O* s$ \5 k8 E
#include<stdio.h>
% w9 w1 G9 s/ x& ^  d#include<string.h>
$ p/ H+ [- s( t3 k; q#define MAXLINE 4096
2 d! z# `& ]- Q1 R2 d7 }#define LISTENQ 1024$ c$ w/ Q# f0 q* o
#include "talk.h". I- K# R. G/ s$ D/ e3 _  c
int main(int argc, char *argv[])
( ]5 b3 v& R/ \- A4 v+ S( S( i& D{
* D- ~* Q7 {; u3 K) z- l int sockfd,n;
; l# {% u# j  L/ c4 t# Y char recvline[MAXLINE+1];9 L* Y5 m- I* B4 U) S1 w4 s
struct sockaddr_in servaddr;) T3 |% B3 T1 K. v! i
if(argc != 2)
& l0 ^" b3 i7 _7 {4 r1 z) Q {
( W7 ~! K+ J& o" k  printf("usage:filename<IP address>");- U% E, @+ f# e3 `1 R. y
  exit(0);
( r/ U3 A( U, I( a0 [$ o }
* _1 ]" B2 w* @7 g1 e" y7 I, ?, d if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)' Q& f6 a* B( ?1 e7 w0 ]8 Y
{
& n5 i( q4 G  U  printf("socket call error\n");
4 w6 x6 o1 E- D1 C, n6 f7 a  exit(0);/ a2 t( W$ l& S/ W
}% V8 a' a; H' ]
bzero(&servaddr,sizeof(servaddr));
# L9 d" Z' j; V- |& Z* c* `, L) t" h5 l servaddr.sin_family = AF_INET;
" H( [: v7 ?5 n+ @  o servaddr.sin_port = htons(14);
& P" z+ J, e; j/ H( Z0 N if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr) <= 0)
' [2 ~0 V8 ?6 d- |" e {6 {- H6 O8 Q, [: c9 F
  printf("inet_pton call error for %s\n",argv[1]);& J+ a- V/ I6 Y+ T
  exit(0);
" F1 b3 h6 j) ~) S9 a9 S }
1 ~. G; x- Z' _0 j; U if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) < 0)
5 n9 l; K2 b6 h& `$ | {
- F% l9 J3 k; Z$ n! a8 W4 ~$ P9 @- J  printf("connect error\n");2 P( |" l  C( ?; B% D+ F, ^4 W8 u
  exit(0);, f2 M) c; O, V& |$ y/ x
}
6 V' A) O) d) T: i* J9 R talk(fileno(stdin),sockfd);  k. j& G! C/ \1 j
exit(0);
" L' {  u& u1 Q- I5 Z- @9 F9 t}
/ \+ g2 G1 Z; Z8 Q  f
+ [2 w; d' \) e' G, A( |/ P3 B # H, C6 e% i5 Z& L& z3 d

  \" Y0 p. P2 Nserver.c. ?- d) Q! a1 ^; V: K

! V( y8 i0 f# W- F' l/*本程序用聊天服务器,支持多个用户连接,采用子进程**/9 ]2 w, X6 `+ _; @, R
#include <stdio.h>
1 s! f4 q  m( @6 A/ }) [#include<sys/socket.h>6 ?* G) g; P9 }, \) A) Z5 z
#include<arpa/inet.h>. A: p" F3 q/ f: p
#include<netinet/in.h>
; E  ]) \# d$ z/ Y#include<errno.h>' c+ S; |% a/ `) f4 V' C
#include<stdio.h>
3 U5 \6 ^1 j4 q( u- S" o* C3 E6 ~#include<sys/wait.h>
1 O7 W" F/ w2 A$ j2 S  `2 l9 L#include<unistd.h>
( L( ?. k  d7 O  L2 P# ?. i#include<signal.h>
: [  z" ^) b! x% O* i8 t+ I: I& e9 C#include<time.h>  C% V$ X8 T" h8 W- c
#include<signal.h>
0 q$ V7 u8 M; L. C8 N#include<sys/types.h>( T# x0 f+ q0 H! p8 v
#include<unistd.h>0 w9 i  U& d6 `8 J1 f
#include "talk.h"
; H9 D; X, H6 `3 y#define LISTENQ 1024' r6 |/ `  v1 E. B: a
void sig_chld(int signo);4 `. `3 Z; G; i
int main(int argc, char *argv[]), {1 n/ X5 c  r
{
+ V$ ~% B# g/ C" _ int listenfd,connfd,connfd1;7 }2 P& ~- @1 w% F7 ]* H
socklen_t len;1 |6 a7 f2 q% o# h9 O1 g
pid_t childpid;, M; z: F# l- r0 o
char buff[MAXLINE];
! h' x  C2 g' p int tag;
9 ~, E2 p" k/ \+ Y struct sockaddr_in servaddr,cliaddr;
; G2 F0 o% t  {% h# f time_t currenttime;
, j/ V& W" p. d len = sizeof(cliaddr);6 Z. e6 E- _/ |9 o( x- r1 B4 i
tag = 0;
% J4 U0 z2 K; _  E* _+ J3 ]+ h, B/ K
listenfd = socket(AF_INET,SOCK_STREAM,0);
* x0 {6 @; s4 n5 Y  c9 X% ~9 ?- z bzero(&servaddr,sizeof(servaddr));
: ?9 d  i5 l; k: t% c8 A5 v, H servaddr.sin_family = AF_INET;
9 L5 D8 t% E3 R- @4 F6 U servaddr.sin_port = htons(14);
" R9 L/ u7 M4 J# @* h servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
) ]0 \. }* \' m3 S; f+ h bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
, X$ B9 i4 J% |/ Q; y, K. { listen(listenfd,LISTENQ);
4 a& ~! v4 L; ]" R; `9 |1 ~+ A signal(SIGCHLD,sig_chld);" ~  O9 {0 p( V- F
while(1)
2 ^8 P9 F8 _. t2 h {
' D  W& U0 a" j  connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&len);6 P- g2 H4 T  y! _6 M
  connfd1 = accept(listenfd,(struct sockaddr *)&cliaddr,&len);
# Y/ e0 |9 |5 m- r0 H' R* w  if((childpid = fork()) == 0)# o# ]/ K6 |( e
  {; z/ B/ B; k5 `* a2 g
   close(listenfd);
/ a* O, [; b! D   transfer(connfd,connfd1);9 `# c# t! ]9 T# B
   close(connfd);
( G1 t+ Z- j9 z8 K% x+ n   close(connfd1);
- F0 {0 {% ^! p# n4 Y0 E' Y" z   exit(0);
) |- \; s4 ]$ s7 b4 ]. p' T" T5 B  }
) r# _3 y5 E$ h* `$ ~2 L8 P$ s  close(connfd);) o+ o) t8 Z6 F) q: C1 \8 u+ K
  close(connfd1);/ ^" }* s/ \! `" l1 y; l
}
; s5 J3 D$ A. s3 E; X}
* K' y6 t+ H  t- l" l) C+ V. J5 C( Q9 j/ K; j% k/ T

3 U' ?2 ~  H) j; Fsig_chld.c
8 ^1 _+ j. b; x3 W) X / ?  R  G& [( D  K) X) l
#include <stdio.h>6 S/ f& Q: l$ n7 Y" }
#include<sys/wait.h>
) r7 A) F8 R/ K$ U4 Z& _#include<sys/types.h>
( ?' F, W( G+ N! ~* \1 s& G$ o+ vvoid sig_chld(int signo)! H% O% q5 m& j6 {. P( b# w
{) E8 E& S  [) E$ P7 x3 F, g
pid_t pid;% A! w; j+ D9 p6 L# o
int stat;
# e( \- I1 q4 a9 Y  Y while((pid = waitpid(-1,&stat,WNOHANG)) > 0);* N! _1 A' R8 b# K" ]7 ]; u0 q
return;
( Q' R, Q3 O% n8 o" u}
3 v8 _* q2 V  v3 M
) P5 t7 L4 R1 [/ f. P3 b4 D) {0 J ' M1 `# N/ W# H$ k
talk.c, ~( t; u) ?( M" m$ T
# q) i" z. p) P9 j% [
#include "talk.h"
4 y( ^% D/ t( p) R% ?#include<sys/select.h>3 Z. u% `$ j0 I/ Y7 v
#include<stdio.h>
' g) a' }' v' Y% ?8 U) z* i. Tvoid talk(int input,int socket)
  v$ a0 y0 p, Y& z! E+ o{. d- R$ X, [! |* O3 o3 j3 E
char buffer[MAXLINE];
! [: B4 g( V5 w3 o int maxfd;
4 V0 h+ ~" {7 `+ ^! ?" m/ t) G3 W fd_set fdset;
) p7 R, B7 ]# a4 j maxfd = max(input,socket) + 1;
, c8 {  q# W. L- W3 z while(1); C) t3 U6 W  F5 t1 S& M0 F
{* l/ F7 S% s: }% g8 t$ ~
  FD_ZERO(&fdset);/ x' e% F1 p- _" l& A: f5 j( D
  FD_SET(input,&fdset);
8 k$ y2 S5 c! U  FD_SET(socket,&fdset);2 G- r7 A& \/ Q9 m$ F
  select(maxfd,&fdset,NULL,NULL,NULL);
3 g/ a7 k; K  p1 H: ^  |. K, `4 \  if(FD_ISSET(input,&fdset))
  h! j/ y, A  T8 V) b  {
# ?" `! F* S7 m4 d/ `# r5 S   if(readLine(input,buffer,MAXLINE) == 0)' j0 }% V: A  T; {
   {, J9 U6 v1 ?. _8 W+ r) ~. o
    printf("input error\n");
& I1 X8 G6 {* ^+ B5 [    exit(0);
# N0 Y, l; H: d" W   }, c/ j& s2 j4 {5 `
   printf("read from keyboard:%s",buffer);" t/ s& d4 D- P: G
   writen(socket,buffer,strlen(buffer));  E( w2 ?2 ?9 I# y' _
  }
) S0 S$ T! _1 {  if(FD_ISSET(socket,&fdset))
: e1 k2 q3 a' B; ?  {$ ?( |( [  t  u
   if(readn(socket,buffer,MAXLINE) == 0)
- a) W* F: K' \   {
6 p, j5 ~6 g- @  e1 B7 q    printf("error server\n");6 v5 z. _! x0 R% ~) L5 y' [3 j* `
    exit(0);
9 k- B- O/ K" C. W   }7 u5 n6 i! S: y2 m6 }' V) n
   printf("receve from socket %d: %s\n",socket,buffer);
, o7 \5 _6 T( S. B1 [% K  }
  c# a) A( {8 C! F$ D! k }7 r2 N$ b9 X( C6 l
}
9 z1 Z) C$ X) O3 x8 M/ O
8 @. l% L5 c- b5 _
# T9 q8 T% h9 m# u! u* Ltalk.h
, M+ _" B" {8 ~ 1 Y5 s0 G( S9 C6 ?7 y; @
#define MAXLINE 4096
# A: v$ O* L& P. M  r6 T#define max(a,b) (a) > (b) ? (a) : (b)7 s$ U' V5 e0 _( F* x* F. @. F* q" b
( i) {- P% D6 q9 u* Y) N+ @
! }2 c; |- B, {
transfer.c8 @  A9 H* P: [' P& ]7 \

/ V$ X0 \4 E, T- j#include <stdio.h>
7 |9 t. @, i) [* d9 V# P7 q5 c#include "talk.h"
/ \1 t7 B7 ?6 h: m( f#include<string.h>
0 w3 k" v! u& E$ ?, ?+ F2 g2 u#include<sys/select.h>
+ ~$ U5 d$ {: ]: u. ^void transfer(int socket1,int socket2)
& a8 c2 ?  y' R& F9 J{
" g. P) t2 K/ x7 p! ] int maxfd;: g: d# `9 `/ r# y
int nchar;
# r# I, A/ Z( P: {, t* l- t fd_set fdset;
! z5 B! B( C3 A char buffer[MAXLINE + 1];7 K, l9 h; G2 {: K
  S$ C( T; }, R* O; e  t3 G
maxfd = max(socket1,socket2) + 1;
$ `6 g+ a* f3 ]0 ~" E5 f printf("transfering ...\n%d %d  %d\n",socket1,socket2,maxfd);1 t* C" `. R* j8 X- Q& f
while(1)
9 F  I- k6 d; w {
: M' ~; [- I7 d, c  FD_ZERO(&fdset);, }- ~! _% h+ }4 L6 n+ x
  FD_SET(socket1,&fdset);5 B0 M" `# S# R! f6 Y
  FD_SET(socket2,&fdset);
5 U1 s% Z& X# c& q  select(maxfd,&fdset,NULL,NULL,NULL);
4 o4 d0 U+ \4 `0 Q  printf("read...\n");" ^% N' I/ H3 L$ H) O4 H
  if(FD_ISSET(socket1,&fdset)): c9 {! ~: x+ x7 I$ P% f0 y6 }
  {/ J5 [3 A1 r, R$ b
   if((nchar = read(socket1,buffer,MAXLINE)) == 0)
5 o; k2 D4 Y- t4 W# S/ _) C   {8 O, n9 H7 k+ C. C% _; Y# `
    strcpy(buffer,"bye bye\n");7 w9 r& p3 j/ l) W
    write(socket2,buffer,9);. G# ?! b$ S1 P% a  o" k
    printf("read...err\n");6 a$ U' M  Y/ `4 {2 x' r
    return;4 S/ ^0 m& f# q! F  u
   }+ ?+ P: v6 w6 l  E6 K; P8 O
   printf("read.from socket1..\n%s %d \n",buffer,nchar);+ |9 k0 {- I; N6 v4 b4 W
   writen(socket2,buffer,nchar);" k/ _9 A4 V. D) K8 [  J% F
   writen(socket1,buffer,nchar);
' [  Z% M$ [  o) {; V9 H9 B) G   * r/ M' {& g3 R8 [+ U: A& d. ?& l" y; _
  }2 H3 u9 J% f: [- N
  if(FD_ISSET(socket2,&fdset))- w$ g2 d. S& e
  {' `9 G+ q$ z* ^5 p& }' x& u
   if((nchar = read(socket2,buffer,MAXLINE)) == 0)& o. a$ v+ o! m+ c7 r& Z- d  C5 }( V
   {& |  u" ?9 t# ^) r" s6 M( t
    strcpy(buffer,"bye bye\n");
0 \, Z  c9 X" y0 U( B# Q    write(socket1,buffer,9);  N6 q1 R: D4 q. x: c
    printf("read...err\n");
  Z' F/ B+ t, n% T  Z2 p; K    return;8 Q  a: R; s( z- z4 G7 N9 [4 L
   }" u7 h* @* b! M" U$ a% m8 b
   printf("read..from socket 2.%s %d\n",buffer,nchar);
# n  F2 _1 k% Z   writen(socket1,buffer,nchar);: w" G2 k! t( }8 s0 H4 t* x1 P+ u1 @
   writen(socket2,buffer,nchar);
$ K. o% _4 M2 \# {0 r7 K! |   
) G& ^) Q# j9 K6 v6 x; ?( f  }+ K9 G7 a- c% y/ J! Q& }7 A
}
4 l. ?3 |' D% V1 I+ z}8 C  L. Q: R4 L1 c
7 \/ n4 P" o. Q1 l0 H- N' d
  e3 \; ]; l! k$ _/ U
4 g& [( O* U' Q  z3 ^0 n

, k! E) Q) D! dmakefile
3 z. Y9 a( `, x) t5 ]0 ~ # m6 \# y) E4 J4 x
all:server client9 D" h* l5 K4 ]3 T
server:server.o transfer.o sig_chld.o fileoperate.o$ b$ f) O' ~; d; E4 ]" Y- A6 a
cc -o server $^% \# S0 @" U# N. w" T! f/ @
client:client.o talk.o fileoperate.o( \6 c) X4 {* Z& ]+ I  i
cc -o client $^
% A3 y, s  G! k1 L- otransfer.o server.o client.o talk.o:talk.h2 C: l1 h* \$ B; |/ D
.PHONY : clean
9 r8 T; `% B. F: Rclean:
2 i1 d, v8 j' }+ y rm *.o
8 O& J0 Y; u0 }0 L- y" Z: M$ U
$ s- p) Y5 K5 {" jfileoperate.c3 F) V$ T) O/ c- g8 R# Z

( a8 {  f1 B  l5 \& \#include<stdio.h>% p! @$ n- B" `0 D/ c1 h2 \& H
#include<errno.h>8 F8 e& H, D1 ]7 p( c
#include<sys/types.h>9 |- |- o$ z  C* A9 f% }" m( L" g
ssize_t readn(int fd,void *vptr,size_t n)
% _$ z8 f) {7 p6 ~{4 c  E2 \; X& }$ h( k9 @& R8 C
ssize_t nleft;
: h1 _( a0 d6 S# w2 ` ssize_t nread;
: c; I. U. G( W( R) E2 u) A' P% L char *ptr = vptr;
' e/ V+ J0 S* R nleft = n;
4 {# I9 t" H* T1 h. S1 `$ c while(nleft > 0)9 @4 c1 S; @' A/ N% b: }# {
{" e- L" v* i1 i
  if((nread = read(fd,ptr,nleft)) < 0)! S, w0 r% l, Y' ^. s4 Z7 A& v7 p
  {) l* c( B2 i8 u* R7 Y
   if(errno ==EINTR)
; Z% X) p. ~3 d4 C: a    nread = 0;
; @( i) x# F0 X9 o   else return(-1);
* Q" n1 u5 R# C! r8 O" V  }
  E- N. f, c" q" O) _) Z  else if(nread == 0); L3 K3 S6 U2 E/ S; Y! @
   break;" h+ V' O5 \, i" m' a7 x" |, g
  nleft = nleft - nread;
4 g  [6 @  y& k8 b8 O' Q8 S, j  ptr += nread;
+ R: o* e& G2 x) L5 T }
7 B/ b8 x. l6 _7 q0 j2 J; j return(n - nleft);8 l" X: k/ X6 e4 B* D, M* I9 F/ F8 l1 Q
}
% y# n: O( j4 U! M9 N; `; dssize_t writen(int fd,const void *vptr,size_t n)
( A/ G9 Q6 p6 Y{! s/ a' ]/ D5 G7 ]
ssize_t nleft;& T8 `/ N" W1 _" a+ j
ssize_t nwrite;" z5 ~2 q' Q  ~% @$ h* _9 A  F
const char *ptr = vptr;, `/ T7 R( b% d( R+ ~; j
nleft =n;' [" A! _3 H5 T7 ~- Q7 Q5 p1 d: D" j4 J
while(nleft > 0)
9 H, ^$ `) }1 o {2 X3 _& s- [/ Z( }- O0 F
  if((nwrite = write(fd,ptr,nleft)) < 0)
( T2 ?( |* e1 D! R: [0 P  {
- W( B" \% e0 M* G" _   if(errno == EINTR)
/ |+ c% }' X" T  I" v: C4 d    nwrite = 0;
7 r8 a( @! m# O1 M  N0 V   else
; J3 l- S" Y' u) o" z! ?8 n    return -1;
8 k# C/ `4 ^% ?0 e, y1 a  }& h8 q7 K; z4 c0 ]! Z* L
  nleft = nleft - nwrite;
+ R+ \0 v2 W% S" v/ H+ ~  ptr += nwrite;/ V8 Q- f" ?" R  a9 v$ b+ m2 m
  printf("writing...\n");  C( d  J4 Z3 b' l4 r& Z! T
}$ G2 c; @9 W) S9 ~" _  f4 ?
printf("write ok\n");
4 N8 ^0 [, L2 { return(n - nleft);4 a5 U+ y. `& i9 S  I2 N: A
}- A+ p( |- [' k% x& v& k
ssize_t readLine(int fd,const void *vptr,size_t maxlen). L/ D( o# ?1 m& t/ @; h  {
{* ^  K& s9 F% @# j2 {" H
ssize_t n,rc;/ ?. G8 A: Q( V1 c
char c,*ptr = vptr;: k$ l9 q6 d8 P
for(n = 1; n<maxlen; n ++)
7 W: a* j( Z: [1 z {8 E0 C% _- l, h9 Z3 S# n  X
  if((rc = read(fd,&c,1)) == 1)$ i* R" X9 ]9 f8 H0 p
  {
. k0 t% q. U) u; L% R   *ptr++ = c;1 L, b+ S! ?) f4 A" A( v
   if(c =='\n')
( B3 h* P- n5 c& `4 ~1 S    break;& |# ]/ o. m" M
  }
: |+ g% H4 [; S: L4 k& g0 F0 v  else if(rc == 0)
; j9 j, K" V4 G2 q. f  {
- h( f7 Y& T' l8 v. \$ S; N4 Y5 k   if(n == 1)
2 H, h8 q. W" D; s& X" b    return(0);" w7 a2 Z& z$ x; l% {
   else
& H) w$ R. L* p  p, ~/ X3 I& ]2 Z$ c    break;
+ @% s, o) h) l) J: y) w/ p8 ^  }8 T0 i' G& M7 `6 T2 e( b/ y
  else! B& Z; t1 C8 f$ K5 u1 }) S; B
  {
2 r  B6 E. I* `   if(errno == EINTR)
3 ]5 k8 C1 t" Z4 L9 [+ A    continue;
8 n0 t0 N: s8 ]6 s+ @4 R/ n   return -1;' b  [: h. O# a! J* l
  }
* D( O8 F3 c/ g3 l }0 T. a7 I0 \4 z! S! w7 G
*ptr = '\0';4 |7 U1 b5 n0 C7 m/ z) C
return(n);" g2 j- O9 |0 ~9 b# H- r. F/ V
}      
附件: 您所在的用户组无法下载或查看附件

TOP

大家快快近来帮帮忙啊:confused: ' C' [$ U' l: N, s
使用方法,make all 后3 k$ s  ^3 P! k: x$ d4 g# o
在一个shell里面启动server
( \. b3 p4 _9 C) i再启动两个shell' X" ^; A. U( [% I
client 127.0.0.1    就可测试了
7 \9 E- J- L# O. L0 z最终结果:在一个客户端的消息发送到另一个。      

TOP

connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&len);/ j. \& g/ _4 H: k4 a4 e/ s
connfd1 = accept(listenfd,(struct sockaddr *)&cliaddr,&len);
6 |* S. Z9 {- W  Q- K+ R/ g
* W0 a+ n6 k8 t3 \/ l9 ]' g- z这么写是什么意思?写代码不要想当然哦      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

这是建立两个连接,我着是个服务器进程,现在只是模拟的,后面这里肯定是要优化的。这个服务器的作用是建立两个客户连接后协助这两个客户端通信,服务器起一个转发的作用。      

TOP

你没有明白我的意思,这根本不是优化不优化的问题。连续两个accept语句会发生什么?这又不是fork。说你想当然了你还不认真去思考。      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

我当然知道你的意思啦,accept会阻塞进程,但是在我的测试中,两个accept都接到了连接。
0 G$ l' m. V; u, B* `并且能收到一放发的数据,但是没法转发,并且后发数据的客户端无法接受键盘数据。我是在一个主机上启动的(服务器端和两个客户端)      

TOP

发新话题