You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by hg...@apache.org on 2004/07/27 15:46:17 UTC
cvs commit: jakarta-tomcat-connectors/ajp/ajplib/test ajp_link.c
hgomez 2004/07/27 06:46:16
Added: ajp/ajplib/test ajp_link.c
Log:
Some socket io (ad minima)
Revision Changes Path
1.1 jakarta-tomcat-connectors/ajp/ajplib/test/ajp_link.c
Index: ajp_link.c
===================================================================
/* Copyright 1999-2004 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "ajp.h"
/**
Resolve host
**/
int ajp_idef_resolve(ajp_env_t *env, char *host, apr_port_t port, ajp_idef_t * idef)
{
int err;
err = apr_sockaddr_info_get(&idef->addr, host, APR_UNSPEC, port, 0, env->pool);
if (err != APR_SUCCESS) {
return err;
}
return 0;
}
/**
Create (connect) instance link
**/
int ajp_ilink_connect(ajp_env_t *env, ajp_idef_t * idef, ajp_ilink_t *link)
{
apr_sockaddr_t *remote_sa = idef->addr;
int ndelay = idef->ndelay;
int keepalive = idef->keepalive;
apr_socket_t *sock;
apr_status_t ret;
apr_int32_t timeout = (apr_int32_t) (idef->timeout * APR_USEC_PER_SEC);
char msg[128];
int connected = 0;
while (remote_sa && !connected) {
if ((ret = apr_socket_create(&sock, remote_sa->family, SOCK_STREAM,
#if (APR_MAJOR_VERSION > 0)
APR_PROTO_TCP,
#endif
env->pool)) != APR_SUCCESS) {
if (remote_sa->next) {
fprintf(stderr,
"ajp_ilink_connect() error %d creating socket to %s\n",
ret, idef->host);
}
else {
fprintf(stderr,
"ajp_ilink_connect() error %d creating socket to %s, no more addr\n",
ret, idef->host);
}
remote_sa = remote_sa->next;
continue;
}
/* store the socket information */
link->sock = sock;
/* no requests yet */
link->requests = 0;
fprintf(stdout, "ajp_ilink_connect() create tcp socket %d\n", sock);
/* the default timeout (0) will set the socket to blocking with
infinite timeouts.
*/
if (timeout <= 0)
apr_socket_timeout_set(sock, -1);
else
apr_socket_timeout_set(sock, timeout);
/* make the connection out of the socket */
do {
ret = apr_socket_connect(sock, remote_sa);
} while (APR_STATUS_IS_EINTR(ret));
/* if an error occurred, loop round and try again */
if (ret != APR_SUCCESS) {
apr_socket_close(sock);
if (remote_sa->next) {
fprintf(stderr,
"ajp_ilink_connect() attempt to connect to %pI (%s) failed %d\n",
remote_sa, idef->host, ret);
}
else {
fprintf(stderr,
"ajp_ilink_connect() attempt to connect to %pI (%s) failed %d, no more addr\n",
remote_sa, idef->host, ret);
}
remote_sa = remote_sa->next;
continue;
}
connected = 1;
}
if (!connected) {
apr_socket_close(sock);
return -1;
}
/* enable the use of keep-alive packets on TCP connection */
if (keepalive) {
int set = 1;
if ((ret =
apr_socket_opt_set(sock, APR_SO_KEEPALIVE, set)) != APR_SUCCESS) {
apr_socket_close(sock);
fprintf(stderr, "ajp_ilink_connect() keepalive failed %d %s\n",
ret, apr_strerror(ret, msg, sizeof(msg)));
return -1;
}
}
/* Disable the Nagle algorithm if ndelay is set */
if (ndelay) {
int set = 1;
if ((ret =
apr_socket_opt_set(sock, APR_TCP_NODELAY, set)) != APR_SUCCESS) {
apr_socket_close(sock);
fprintf(stderr, "ajp_ilink_connect() nodelay failed %d %s\n",
ret, apr_strerror(ret, msg, sizeof(msg)));
return -1;
}
}
fprintf(stdout, "ajp_ilink_connect(), sock = %d\n", sock);
return 0;
}
/**
Close instance link
**/
int ajp_ilink_close(ajp_env_t *env, ajp_ilink_t *link)
{
apr_socket_t *sd;
apr_status_t rc;
sd = link->sock;
if (sd == NULL)
return -1;
fprintf(stdout,
"ajp_ilink_close() closing sock = %d after %d requests\n",
sd, link->requests);
rc = apr_socket_close(sd);
return rc;
}
int ajp_ilink_send(ajp_env_t *env, ajp_ilink_t *link, ajp_msg_t *msg)
{
char *b;
int len;
apr_socket_t *sock;
apr_status_t stat;
apr_size_t length;
char data[128];
sock = link->sock;
if (sock == NULL)
return -1;
ajp_msg_end(env, msg);
len = msg->len;
b = msg->buf;
length = (apr_size_t) len;
do {
apr_size_t written = length;
stat = apr_socket_send(sock, b, &written);
if (stat != APR_SUCCESS) {
fprintf(stderr,
"ajp_ilink_send() send failed %d %s\n",
stat, apr_strerror(stat, data, sizeof(data)));
return -3; /* -2 is not possible... */
}
length -= written;
b += written;
} while (length);
return 0;
}
static int ajp_ilink_readN(ajp_env_t *env, ajp_ilink_t *link, char * buf, apr_size_t len)
{
apr_socket_t *sock;
apr_size_t length;
apr_status_t stat;
int rdlen;
sock = link->sock;
if (sock == NULL)
return -1;
rdlen = 0;
length = len;
while (rdlen < len) {
stat = apr_socket_recv(sock, buf + rdlen, &length);
if (stat == APR_EOF)
return -1; /* socket closed. */
else if (APR_STATUS_IS_EAGAIN(stat))
continue;
else if (stat != APR_SUCCESS)
return -1; /* any error. */
rdlen += length;
length = (apr_size_t) (len - rdlen);
}
return rdlen;
}
int ajp_ilink_receive(ajp_env_t *env, ajp_ilink_t *link, ajp_msg_t *msg)
{
int hlen = msg->headerLen;
int blen;
int rc;
ajp_ilink_channel_apr_readN(env, link, msg->buf, hlen);
blen = ajp_msg_check_header(env, msg);
if (blen < 0) {
fprintf(stderr,
"ajp_ilink_receive() received bad header\n");
return -1;
}
rc = jk2_channel_apr_readN(env, link, msg->buf + hlen, blen);
if (rc < 0) {
fprintf(stderr,
"ajp_ilink_receive() error while receiving message body %d %d\n",
rc, errno);
return -2;
}
fprintf(stdout,
"ajp_ilink_receive() received packet len=%d type=%d\n",
blen, (int)msg->buf[hlen]);
return 0;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org