File:  [Public] / libwww / Library / src / HTTCP.html
Revision 2.19: download - view: text, annotated - select for diffs
Fri Nov 25 14:43:24 1994 UTC (29 years, 6 months ago) by frystyk
Branches: MAIN
CVS tags: v3/0pre1, HEAD
missing ';'

<HTML>
<HEAD>
<TITLE>/Net/dxcern/userd/timbl/hypertext/WWW/Library/src/HTTCP.html</TITLE>
</HEAD>
<BODY>

<H1>Generic Network Communication</H1>

<PRE>
/*
**	(c) COPYRIGHT CERN 1994.
**	Please first read the full copyright statement in the file COPYRIGH.
*/
</PRE>

This module has the common code for handling TCP/IP and DECnet connections
etc. The main topics of functions in this module are:

<UL>
<LI><A HREF="#ConEst">Connection establishment</A>
<LI><A HREF="#hostcache">Cache of host names</A>
<LI><A HREF="#DNS">Host and mail addresses</A>
<LI><A HREF="#Signals">Signal Handling</A>
</UL>

This module is implemented by <A HREF="HTTCP.c">HTTCP.c</A>, and it is
a part of the <A
HREF="http://info.cern.ch/hypertext/WWW/Library/User/Guide/Guide.html">
Library of Common Code</A>.

<PRE>
#ifndef HTTCP_H
#define HTTCP_H

#include "HTUtils.h"
#include "HTAccess.h"

#ifdef SHORT_NAMES
#define HTInetStatus		HTInStat
#define HTInetString 		HTInStri
#define HTParseInet		HTPaInet
#endif
</PRE>

<H2>Connection Management</H2>

All connections are established through the following functions.

<A NAME="ConEst"><H3>Active Connection Establishment</H3></A>

This makes an active connect to the specified host. The <A
HREF="HTAccess.html#HTNetInfo">HTNetInfo structure</A> is parsed in
order to handle errors. Default port might be overwritten by any port
indication in the <A
HREF="http://info.cern.ch/hypertext/WWW/Addressing/URL/Overview.html">URL</A>
specified as &lt;host&gt;:&lt;port&gt; If it is a multihomed host then
HTDoConnect measures the time to do the connection and updates the
calculated weights in the cache of visited hosts.

<PRE>
extern int HTDoConnect PARAMS((	HTNetInfo  	*net,
				char		*url,
			     	u_short		default_port,
			    	u_long 		*addr,
				BOOL		use_cur));
</PRE>

<H3>Passive Connection Establishment</H3>

This function makes a non-blocking accept on a port and polls every second
until MAX_ACCEPT_POLL is reached.

<PRE>
extern int HTDoAccept PARAMS((HTNetInfo *net));
</PRE>

<A NAME="hostcache"><H2>Caching Hosts Names</H2></A>

This part of the HTTCP module maintains a cache of all visited hosts so that
subsequent connects to the same host doesn't imply a new request to the DNS
every time. <P>

Multihomed hosts are treated specially in that the time spend on every connect
is measured and kept in the cache. On the next request to the same host, the
IP-address with the lowest average connect time is chosen. If one IP-address
fails completely, e.g. <EM>connection refused</EM> then it disabled and
HTDoConnect tries one of the other IP-addresses to the same host.<P>

If the connect fails in the case of at single-homed host then the entry is
removed from the cache and HTDoConnect tries again asking the DNS.

<H3>Recalculating the Time-Weights on Multihomed Hosts</H3>

On every connect to a multihomed host, the average connect time is updated
exponentially for all the entries.

<PRE>
extern void HTTCPAddrWeights PARAMS((char * host, time_t deltatime));
</PRE>

<H3>Control Variables</H3>

This parameter determines the maximum number of hosts in the cache. The
default number is 500.

<PRE>
extern unsigned int	HTConCacheSize;
</PRE>

<H2>Errors and status indications</H2>

Theese functions return an explanation if an error has occured.

<H3>Errno Message</H3>

Return error message corresponding to current errno, just like strerror().

<PRE>
extern CONST char * HTErrnoString NOPARAMS;
</PRE>

<H3>Description of what Caused the Error</H3>

The parameter `where' gives a description of what caused the error, often
the name of a system call. <P>

This function should only rarely be called directly. Instead the common error
function HTErrorAdd() should be used as then the error is parsed all the way
to the user. The function returns a negative status in the unix way.

<PRE>
extern int HTInetStatus PARAMS((char * where));
</PRE>

<H3>Parse a Cardinal Value</H3>

<PRE>
/*	Parse a cardinal value				       parse_cardinal()
**	----------------------
**
** On entry:
** 	*pp points to first character to be interpreted, terminated by
** 	non 0..9 character.
** 	*pstatus points to status already valid,
** 	maxvalue gives the largest allowable value.
**
** On exit:
** 	*pp points to first unread character,
** 	*pstatus points to status updated iff bad
*/

extern unsigned int HTCardinal PARAMS((int *		pstatus,
				       char **		pp,
				       unsigned int	max_value));
</PRE>

<A NAME="DNS"><H2>Internet Name Server Functions</H2></A>

The following functions are available to get information about a
specified host.

<H3>Produce a string for an internet address</H3>

This function is equivalent to the BSD system call <B>inet_ntoa</B> in that it
converts a numeric 32-bit IP-address to a dotted-notation decimal string. The
pointer returned points to static memory which must be copied if it is to be
kept.

<PRE>
extern CONST char * HTInetString PARAMS((struct sockaddr_in * sin));
</PRE>

<H3>Parse an internet node address and port</H3>

This function finds the address of a specified host and fills out the sockaddr
structure. str points to a string with a node name or number, with optional
trailing colon and port number. sin points to the binary internet or decnet
address field. <P>

On exit *sin is filled in. If no port is specified in str, that field is left
unchanged in *sin. On success, the number of homes on the host is returned.
<PRE>
extern int HTParseInet PARAMS((	struct sockaddr_in *	sin,
			       	CONST char *		str,
				BOOL			use_cur));
</PRE>

<H3>Name of a Machine on the Other Side of a Socket</H3>

This function should have been called HTGetHostByAddr but for historical
reasons this is not the case. <P>

<EM><NOTE>Note:</NOTE>This function used to be called HTGetHostName but
this is now used to find you own host name, see <A HREF="HTTCP.html#HTGetHostName">HTGetHostName()</A></EM>

<PRE>
extern char * HTGetHostBySock PARAMS((int soc));
</PRE>

<H3>Host address retuned for specified host name</H3>

This function gets the address of the host and puts it in to the socket
structure. It maintains its own cache of connections so that the communication
to the Domain Name Server is minimized. If OK and single homed host then
it returns 0 but if it is a multi-homed host then 1 is returned.

<PRE>
extern int HTGetHostByName PARAMS((char *host, SockA *sin, BOOL use_cur));
</PRE>


<A NAME="HTGetHostName"><H3>Get Name of This Machine</H3></A>

This function returns a CONET char pointer to a static location containing
the name of this host or NULL if not available.

<PRE>
extern CONST char * HTGetHostName NOPARAMS;
</PRE>


<H3>Set Name of This Machine</H3>

This function overwrites any other value of current host name. This might
be set by the user to change the value in the ID value parsed to a news host
when posting. The change doesn't influence the <A HREF="HTTCP.html#Mailaddress">Mail Address</A> as they are stored in two different locations. If, however,
the change is done before the first call to HTGetMailAddress() then this 
function will use the new host and domain name.

<PRE>
extern void HTSetHostName PARAMS((char * host));
</PRE>


<H3>Get Domain Name of This Machine</H3>

This function rerturns the domain name part of the host name as returned by
HTGetHostName() function. Changing the domain name requires a call to 
HTSetHostname().

<PRE>
extern CONST char *HTGetDomainName NOPARAMS;
</PRE>


<A NAME="Mailaddress"><H3>Get User Mail Address</H3></A>

This functions returns a char pointer to a static location containing the
mail address of the current user. The static location is different from the
one of the current host name so different values can be assigned. The default
value is &lt;USER&gt;@hostname where hostname is as returned by HTGetHostName().

<PRE>
extern CONST char * HTGetMailAddress NOPARAMS;
</PRE>


<H3>Set User Mail Address</H3>

This function overwrites any other value of current mail address. This might
be set by the user to change the value in the  <A HREF="http://info.cern.ch/hypertext/WWW/Protocols/HTTP/HTRQ_Headers.html#from">From field</A> in the <A HREF="http://info.cern.ch/hypertext/WWW/Protocols/HTTP/HTTP2.html">HTTP Protocol</A>.

<PRE>
extern void HTSetMailAddress PARAMS((char * address));
</PRE>

<H2>Signal Handling</H2>

This is only necessary to compile on a few platforms and only if the
application does not have its own signal handling.

<PRE>
#ifdef WWWLIB_SIG
extern void HTSetSignal NOPARAMS;
#endif

#endif   /* HTTCP_H */
</PRE>

End of file
</BODY>
</HTML>




Webmaster