发新话题
打印

【求助】关于通讯方面客户端常出现connect不上的问题

【求助】关于通讯方面客户端常出现connect不上的问题

server端:redhat 9.0+mysql,一个主进程和8个数据库连接池的进程(mysql),server结得connect请求后即fork一个新进程进行读取通讯数据(200个字节左右),然后通消息通道与数据库连接池的进程进行通讯。
, X/ C% M0 J& ~2 t' w
# M6 k7 N- ^5 @6 |* i8 U1 ?client端:通过tcp/ip与server端通讯。大约有20个client端。
) P% `' k4 W" w, N! k
  P* S, Z( n' Z; d现在的问题是:其中有很多的client端无规律的出现connect不上的情况(connect后的每一步我都有日志的记录)。server端未报任何错误。% a4 q; D% H, k0 S2 d( c5 |* s

7 C" r! o0 Q1 A2 D3 f" R1 V请问各位可能是什么原因      

TOP

接受连接的代码?      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

void server( lsock ); l1 c  `% E5 E. |9 p6 u2 M+ h. e, Y# W
int lsock;
" j/ o: Y2 A4 J  d0 |$ l& }{$ v4 H% _, o$ e7 [" I/ K
        int         ret;
( [; u1 K3 M3 [& c' h7 d, f4 X        int         sock;
$ u0 L, m9 }. B; T+ B. o        long         cli_ip;: m2 s* |* ]- A3 E5 q- ^. r. Z
        extern long protm;. v9 w" i- A5 V; N
        ushort         semarray[ 1 ];
0 T. F! W) [9 U$ l
8 o7 P; g- [0 X. |        semarray[0] = dealerds;
; y$ k& n) C0 U+ I/ O1 l9 f8 v1 E        fprintf(stderr,"semid=%d\n", semid);
- `, O  `  B3 l; v+ C        ret = semctl( semid, 0, SETALL, semarray );$ G. z2 v8 C7 Z. [5 O
       
  \+ {3 ^  N4 _$ ?        if(ret){& r: b) J/ T) |* X+ V
                fprintf(stderr, "backdrm: Set sempaphore ret = %d exit at %s.\n", ret,timestr() );3 n) z8 L8 f/ u* R  M
                return;
! P, u! d3 {; g9 p        }
- R" p4 @$ b1 _2 O, p  p$ H2 N
: e; j6 c; {! Y% F) M3 _        protm=0L;
  s, ^. B( o: n' J        while(1) {
# y+ V0 e, I/ B+ k: X$ l                ++protm;
* G0 F; ^, o1 B/ H( X$ A; ?1 X& R                sock = AcceptSock( lsock, &cli_ip );
" A: I( D+ V6 y8 x6 B, `, r% E                if( sock<0 ){- b. y6 j- a. x6 n6 c

* E; x8 X9 g2 W  A3 q0 Y* x8 _                        fprintf(stderr, "sock=%d\n", sock);
2 E- T4 t, N3 l3 i1 v5 V& c6 @                        continue;: V% @8 x1 v0 y/ _0 Z
                }
& O' S; c$ F* e+ ~& E4 Z  S% G& S                switch( fork() ){% q8 x6 ]7 }& y3 V  i: V
                case -1:
; k+ h1 c6 v, L, y. f                        /* Do not exit, Accept again. */
- i+ T8 v; ^# _1 X1 r# h                        perror( "fork()" );0 a& _. r/ r, D) B7 Q2 V
                        close( sock );
, N$ ?( z! I: p' F1 A( U                        break;1 r3 t+ o' q4 t, _  Z( ?3 _
                case  0:: A0 A1 }3 X2 d
                       
& m/ F3 ^; i' `' f                        /*fprintf(stderr,"\nProcess %d started at %s.\n", getpid() ,timestr());*/+ @: Q$ l; T* F8 B: ]
                        close(lsock);1 [$ {8 t. c+ B' X5 {6 S
                        backdrm( sock );& G, P1 o. ?. _0 [- O# u
1 m( i$ }5 x4 [/ |( E& ^" }; E
                        /*fprintf(stderr,"rocess %d exit at %s.\n", getpid(),timestr() );*/: I2 T+ ?+ E2 U! `7 ^
                        exit(0);
, M1 q( ^  d/ T                default:
  o, G5 ?7 T+ y                        close( sock );
: W; f+ h1 M' [7 X                }
/ Y4 o' Z* F, `7 i7 g" [/ d" L+ J. g        }# c4 T! O/ s/ X6 ~' O" [: Q8 N
}  p) g. X7 Y' Q

; Q0 `" Z$ e2 X' i/* Process flow depends on process id;/ e6 V" {3 ]% w0 l" A1 b
*/) t4 {* e  I2 N) n2 u
" K9 K/ Q; |/ L9 f/ l- l* C
void backdrm(sock); F7 t! N' K! P$ A9 ^+ Q0 x& {+ q
int sock;* s& h& l! `% G4 E: i+ f
{
- C& v% ~" N" Z/ X        int         getlen=0, ret=0, tries,sizes,salemanret;* O: B7 Z/ B' _& P; |
        int         tran_id_val;8 ^( Q2 o3 i8 X) L1 \
        char        buf[ BUFLEN ];; f3 H3 B9 }3 g* ^! z
        char tran_id;
3 t! P* B" e# z        DRMPKGEXT drmpkg;
* X8 k8 V; M- y# g1 M        DRMPKG                clientpkg;
  F. h, k$ Z" n8 J- X. K" E& Y        RETPKG tmppkg1;( c2 D4 V2 B) ?; z7 M; h7 N
        memset(buf,0,sizeof(buf));9 |  N7 e7 x# |# }; R8 U' i" W1 G; {( W
        memset(&tmppkg1,0,sizeof(RETPKG));- M, C  {- A# \* L
        memset(&clientpkg,0,sizeof(DRMPKG));
& c+ D1 R$ l4 u# }  |        memset(&drmpkg,0,sizeof(DRMPKGEXT));* D* U6 R& y# Y; Y
       
5 \" J. S0 f8 ]. U/ V2 U        memset( &msg, '\0', sizeof( struct message ) );
2 @1 M# }. Q+ ]" E& Q/ R8 ~, y        memset(&clientpkg,0,sizeof(DRMPKG));% }! K; T, Y9 v$ z/ I0 C4 O
        memset(&drmpkg,0,sizeof(DRMPKGEXT));. W. O' u! B, F" F0 g
        memset(buf,0,BUFLEN);# u5 f4 o& d. r2 Q, R. Y  z6 B' q
#ifdef DEBUG               
* F5 D3 o  J2 efprintf(stderr,"step3,%d,sock=%d\n", sizes,sock);               
7 z7 A$ p& W# t/ V$ X#endif
2 |: r2 G  H  F2 F- H2 z
( H) x5 o! J) a% Q& C; P; z        signal (SIGALRM, tmout_fun);  V. F1 B' B! D& `
  { struct sigaction sa;
; V5 v2 q, y7 Q/ b    sigaction (SIGALRM, (struct sigaction *)0, &sa);
; L6 e, ?/ c( Y' n: X( m#ifdef SA_RESTART
" n7 s7 _6 e2 q0 R, Z( z    sa.sa_flags |= SA_RESTART;: u; r8 c+ o2 T; j: r6 I
#endif# h; J! A( ?2 @+ K- t6 t
#ifdef SA_INTERRUPT* R: Q$ b% v0 r3 B. z2 B0 f0 a
    sa.sa_flags &= ~ SA_INTERRUPT;: b3 e5 Z9 `; I0 o
#endif
7 ~2 Y( A2 P$ y2 `    sigaction (SIGALRM, &sa, (struct sigaction *)0);
2 A0 z# p+ ^8 V+ `- X  }
1 ?' c& }% r! J! n( A
5 x$ B# L/ S; n0 b4 k) H1 k; @+ D2 O7 W' S
                alarm(10);         ' g: r% g5 [3 ~/ v; d
                if ((sizes=GetPkg(sock, &clientpkg, sizeof(DRMPKG)))!=sizeof(DRMPKG))
0 m6 F4 A3 ?- v( p; @5 u                {
, o( z" f5 t2 ~0 ]/ i( O$ ~                        fprintf(stderr,"recv size error,%d,sock=%d,struct size=%d\n", sizes,sock,sizeof(DRMPKG));
3 k2 t! D% x) `0 J                        close(sock);1 a' s: C( d( f$ ]0 U3 D5 |
                        return;
- t: _5 I9 Y' A2 \: u6 P                       
' _& d9 l, }; |! o1 M' O                }
1 o$ }& U& i; n4 O) T                alarm(0);         4 x$ e5 d6 @9 h; ^8 z2 f" I
4 N" Z9 l$ {; o2 F2 ]
                if (drmpkgtoext(&drmpkg,&clientpkg) )
' F9 w) l( }& E" r                {
1 k4 C$ ^5 S5 R; K1 q                        fprintf(stderr,"transfer error\n", sizes,sock);
. y# h) N0 m0 D+ D: y                        close(sock);
9 S( ?' U% a6 N& o, ?) u$ V' ?4 M                        return;! O1 j/ R# h3 w, g# Y  f
                }
$ q& a7 @1 t* e! C, \- H: t
& H! W* j8 }1 y3 F$ C8 d6 w                memcpy(msg.m.buf,(char *)&drmpkg,sizeof(DRMPKGEXT));/ b2 B5 l1 P2 N. x1 Q7 j: ~8 }

$ G) a: M" n% G; T. F3 C% S% a               
& V( U. w3 Z  b; A  W/ o6 z4 n! \
4 h% C9 g9 P) p                salemanret=salesman( sizeof(DRMPKGEXT) );
, p6 D0 Q# Y8 U
+ @; l. v6 ]* w3 ~5 h
; t! U* t, }# R& ^                ret=PutPkg(sock,msg.m.buf,sizeof(RETPKG));: U+ K2 [: }* L/ k5 Z( Z# r
                if (ret). A0 N$ o' D$ X! z+ i
                {: q* g) E: |* H# O
                        fprintf(stderr,"send error,ret:%d package:%s\n",ret,msg.m.buf );, Z2 c6 u3 S2 S5 [$ V6 g
                }
' l4 C* x& e% N3 N# _% c6 f% M/ ^5 [$ x# Z/ e+ r
                usleep(delaytime*1000);               
1 I( s5 o8 x) P/ ~                return;! @6 g* G* E) l" x: ~5 [
}      

TOP

int AcceptSock( lsock, cli_ip )( K! Y; \' O: R) n
int lsock;, H+ j* \# z2 w( ?, p/ x: `. D& k
u_long *cli_ip;
. A. V) u6 {6 u# v% k{
# d7 t: o" ~/ ?& V* pint opt;
/ D$ L! C( M7 U6 o; }$ f" Xint newsock;
; @. s' R+ l8 y8 {3 u1 w' v( y- W/* socklen_t addr_len;AIX432*/6 W9 B6 V: B, x" a) o( N
int addr_len;/*Sco OpenServer(TM) Release 5*/
1 K( \; U& R$ g- m1 T. sstruct sockaddr_in cli_addr;
; {; l7 S  G& H* M. lstruct linger linv;4 m2 Y4 L' f/ J' G1 F
2 F  w0 ?5 v7 X& _  a. N/ B" L

* p0 `5 c% ~" Paddr_len = sizeof( struct sockaddr );
- V* U& a* j8 z; ^if( (newsock=accept(lsock, (struct sockaddr *)&cli_addr,
3 H4 ]" T( d1 K6 a&addr_len)) >= 0 ){
' ]" b# S9 r6 k/* Enable Keepalive Option in TCP/IP */
; c! }/ R* g" y7 W  a9 S/*
2 X0 N/ S# S- t4 |6 D& Gopt = 1;
9 Z& k7 @* e$ S, N5 lsetsockopt(newsock, SOL_SOCKET, SO_KEEPALIVE, (char*)&opt, sizeof(opt));6 C' K3 X) F: B
*/
, {" _& ?% z/ h. [$ ~/*0 J* B9 S' \+ z/ r
linv.l_onoff = 1;
/ z- b& g2 _/ c) V$ Tlinv.l_linger = 30;
: c) `# x) t4 x- B! v5 ^opt = 1;
: w. Y8 o; B+ tsetsockopt(newsock, SOL_SOCKET, SO_KEEPALIVE, (char*)&opt, sizeof(opt));9 D* t, @3 s; B- w
setsockopt(newsock, SOL_SOCKET, SO_LINGER, (char*)&linv,
( v5 `8 ]- U5 G/ ~7 z( ^% c4 Xsizeof(struct linger));6 `* X  P$ M; \* o6 G- f$ C1 g% P8 e
*/' I0 T" b' H0 ^  m/ Z% Z9 h
if( cli_ip != NULL ) *cli_ip = cli_addr.sin_addr.s_addr;6 X- J& _/ g% S% n* g+ q) J& F, I
return newsock;
* \5 p" B% {- R8 x5 X9 t}
2 K" B; o# x; C+ b9 A0 \/ C3 D#ifdef DEBUG
3 R& \) ]+ Y, L& s" x+ N% sperror( "accept()" );2 h2 b3 n. q  j/ Q. _4 G! r
#endif6 ]4 @+ Y; O  N' d3 K" O5 F  h4 U
return -1;/ S$ R2 c9 o6 ]- w: W) K
}      

TOP

不是很清楚具体的运行情况,服务器端没什么异常?看不出代码有什么特别的,觉得如果只是客户端连不上,服务器端可能已经崩溃了。      
上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。

TOP

服务端没有异常,20个客户端大约中有3,4个在发送了几百笔后就会报一个错了,报完后还可以继续发送的。感觉像是在connect时出的错。
- {" e8 k  w& ~! q" s另外,我的服务器会根据客户端发送的数据进行一些打印任务。每个客户端对应了一台打印机安装在我们服务器上,会不会是打印任务多时会有很此现象      

TOP

发新话题