Return-Path: Delivered-To: apmail-jakarta-tomcat-dev-archive@apache.org Received: (qmail 60979 invoked from network); 27 Jun 2002 17:16:44 -0000 Received: from unknown (HELO nagoya.betaversion.org) (192.18.49.131) by 209.66.108.5 with SMTP; 27 Jun 2002 17:16:44 -0000 Received: (qmail 24483 invoked by uid 97); 27 Jun 2002 17:16:44 -0000 Delivered-To: qmlist-jakarta-archive-tomcat-dev@jakarta.apache.org Received: (qmail 24451 invoked by uid 97); 27 Jun 2002 17:16:44 -0000 Mailing-List: contact tomcat-dev-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Tomcat Developers List" Reply-To: "Tomcat Developers List" Delivered-To: mailing list tomcat-dev@jakarta.apache.org Received: (qmail 24440 invoked by uid 97); 27 Jun 2002 17:16:42 -0000 X-Antivirus: nagoya (v4198 created Apr 24 2002) Date: 27 Jun 2002 17:16:28 -0000 Message-ID: <20020627171628.90869.qmail@icarus.apache.org> From: mturk@apache.org To: jakarta-tomcat-connectors-cvs@apache.org Subject: cvs commit: jakarta-tomcat-connectors/jk/native2/common jk_channel_socket.c X-Spam-Rating: 209.66.108.5 1.6.2 0/1000/N X-Spam-Rating: 209.66.108.5 1.6.2 0/1000/N mturk 2002/06/27 10:16:28 Modified: jk/native2/common jk_channel_socket.c Log: Added socket keepalive and send/recv timeout options. keepalive=1/0 (enabled/disabled) timeout=nn (seconds) Added nodelay option (default disabled) nodelay=1/0 (enabled/disabled) Revision Changes Path 1.36 +93 -58 jakarta-tomcat-connectors/jk/native2/common/jk_channel_socket.c Index: jk_channel_socket.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_channel_socket.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -r1.35 -r1.36 --- jk_channel_socket.c 23 Jun 2002 06:55:55 -0000 1.35 +++ jk_channel_socket.c 27 Jun 2002 17:16:28 -0000 1.36 @@ -80,7 +80,7 @@ #include "jk_registry.h" #ifndef WIN32 - #define closesocket close + #define closesocket close #endif #define DEFAULT_HOST "127.0.0.1" @@ -92,6 +92,8 @@ struct sockaddr_in addr; char *host; short port; + int keepalive; + int timeout; }; typedef struct jk_channel_socket_private jk_channel_socket_private_t; @@ -122,12 +124,18 @@ jk_channel_t *ch=(jk_channel_t *)mbean->object; char *value=(char *)valueP; jk_channel_socket_private_t *socketInfo= - (jk_channel_socket_private_t *)(ch->_privatePtr); + (jk_channel_socket_private_t *)(ch->_privatePtr); if( strcmp( "host", name ) == 0 ) { - socketInfo->host=value; + socketInfo->host=value; } else if( strcmp( "port", name ) == 0 ) { socketInfo->port=atoi( value ); + } else if( strcmp( "keepalive", name ) == 0 ) { + socketInfo->keepalive=atoi( value ); + } else if( strcmp( "timeout", name ) == 0 ) { + socketInfo->timeout=atoi( value ); + } else if( strcmp( "nodelay", name ) == 0 ) { + socketInfo->ndelay=atoi( value ); } else { return jk2_channel_setAttribute( env, mbean, name, valueP ); } @@ -141,7 +149,7 @@ { jk_channel_t *ch=chB->object; jk_channel_socket_private_t *socketInfo= - (jk_channel_socket_private_t *)(ch->_privatePtr); + (jk_channel_socket_private_t *)(ch->_privatePtr); int rc; char *host=socketInfo->host; @@ -180,7 +188,7 @@ rc=jk2_channel_socket_resolve( env, socketInfo->host, socketInfo->port, &socketInfo->addr ); if( rc!= JK_OK ) { - env->l->jkLog(env, env->l, JK_LOG_ERROR, "jk2_channel_socket_init: " + env->l->jkLog(env, env->l, JK_LOG_ERROR, "jk2_channel_socket_init: " "can't resolve %s:%d errno=%d\n", socketInfo->host, socketInfo->port, errno ); } @@ -250,14 +258,16 @@ { /* int err; */ jk_channel_socket_private_t *socketInfo= - (jk_channel_socket_private_t *)(ch->_privatePtr); + (jk_channel_socket_private_t *)(ch->_privatePtr); struct sockaddr_in *addr=&socketInfo->addr; int ndelay=socketInfo->ndelay; + int keepalive=socketInfo->keepalive; + int ntimeout=socketInfo->timeout; int sock; int ret; - + sock = socket(AF_INET, SOCK_STREAM, 0); if(sock < 0) { #ifdef WIN32 @@ -271,6 +281,24 @@ return JK_ERR; } + if (ntimeout >= 0) { + /* convert from seconds to ms */ + int set = ntimeout * 1000; + u_long zero = 0; + if (ioctlsocket(sock, FIONBIO, &zero) == SOCKET_ERROR) { +#ifdef WIN32 + errno = WSAGetLastError() - WSABASEERR; +#endif /* WIN32 */ + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "channelSocket.open() ioctlcocket failed %s:%d %d %s \n", + socketInfo->host, socketInfo->port, errno, strerror( errno ) ); + return JK_ERR; + } + + setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &set, sizeof(set)); + setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *) &set, sizeof(set)); + } + /* Tries to connect to JServ (continues trying while error is EINTR) */ do { if( ch->mbean->debug > 0 ) @@ -292,11 +320,18 @@ if(ret != 0 ) { jk2_close_socket(env, sock); env->l->jkLog(env, env->l, JK_LOG_ERROR, - "channelSocket.connect() connect failed %s:%d %d %s \n", + "channelSocket.open() connect failed %s:%d %d %s \n", socketInfo->host, socketInfo->port, errno, strerror( errno ) ); return JK_ERR; } + /* Enable the use of keep-alive packets on TCP connection */ + if(keepalive) { + int set = 1; + setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,(char *)&set,sizeof(set)); + } + + /* Disable the Nagle algorithm if ndelay is set */ if(ndelay) { int set = 1; setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,(char *)&set,sizeof(set)); @@ -362,13 +397,13 @@ #else int this_time = write(sd, (char *)b + sent , len - sent); #endif - if(0 == this_time) { - return -2; - } - if(this_time < 0) { - return this_time; - } - sent += this_time; + if(0 == this_time) { + return -2; + } + if(this_time < 0) { + return this_time; + } + sent += this_time; } /* return sent; */ return JK_OK; /* 0 */ @@ -398,31 +433,31 @@ while(rdlen < len) { #ifdef WIN32 - /* WIN32 read cannot operate on sockets */ - int this_time = recv(sd, - (char *)b + rdlen, - len - rdlen, 0); + /* WIN32 read cannot operate on sockets */ + int this_time = recv(sd, + (char *)b + rdlen, + len - rdlen, 0); #else - int this_time = read(sd, - (char *)b + rdlen, - len - rdlen); + int this_time = read(sd, + (char *)b + rdlen, + len - rdlen); #endif - if(-1 == this_time) { + if(-1 == this_time) { #ifdef WIN32 - if(SOCKET_ERROR == this_time) { - errno = WSAGetLastError() - WSABASEERR; - } + if(SOCKET_ERROR == this_time) { + errno = WSAGetLastError() - WSABASEERR; + } #endif /* WIN32 */ - - if(EAGAIN == errno) { - continue; - } - return -1; - } - if(0 == this_time) { - return -1; - } - rdlen += this_time; + + if(EAGAIN == errno) { + continue; + } + return -1; + } + if(0 == this_time) { + return -1; + } + rdlen += this_time; } return rdlen; } @@ -442,32 +477,32 @@ while(rdlen < minLen ) { #ifdef WIN32 - /* WIN32 read cannot operate on sockets */ - int this_time = recv(sd, - (char *)b + rdlen, - maxLen - rdlen, 0); + /* WIN32 read cannot operate on sockets */ + int this_time = recv(sd, + (char *)b + rdlen, + maxLen - rdlen, 0); #else - int this_time = read(sd, - (char *)b + rdlen, - maxLen - rdlen); + int this_time = read(sd, + (char *)b + rdlen, + maxLen - rdlen); #endif /* fprintf(stderr, "XXX received %d\n", this_time ); */ - if(-1 == this_time) { + if(-1 == this_time) { #ifdef WIN32 - if(SOCKET_ERROR == this_time) { - errno = WSAGetLastError() - WSABASEERR; - } + if(SOCKET_ERROR == this_time) { + errno = WSAGetLastError() - WSABASEERR; + } #endif /* WIN32 */ - - if(EAGAIN == errno) { - continue; - } - return -1; - } - if(0 == this_time) { - return -1; - } - rdlen += this_time; + + if(EAGAIN == errno) { + continue; + } + return -1; + } + if(0 == this_time) { + return -1; + } + rdlen += this_time; } return rdlen; } @@ -589,7 +624,7 @@ ch=(jk_channel_t *)pool->calloc(env, pool, sizeof( jk_channel_t)); ch->_privatePtr= (jk_channel_socket_private_t *) - pool->calloc( env, pool, sizeof( jk_channel_socket_private_t)); + pool->calloc( env, pool, sizeof( jk_channel_socket_private_t)); ch->recv= jk2_channel_socket_recv; ch->send= jk2_channel_socket_send; -- To unsubscribe, e-mail: For additional commands, e-mail: