www.pudn.com > watsock.zip > TCP.H


/* 
 * Waterloo TCP 
 * 
 * Copyright 1991, University of Waterloo 
 * 
 * This library is free software; you can use it or redistribute under 
 * the terms of the license included in LICENSE.H. 
 * 
 * This program is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 * file LICENSE.H for more details. 
 * 
 * This network library was created by Erick Engelke of the University of 
 * Waterloo, Waterloo, Ontario, Canada. 
 * 
 * Name resolution services were adapted from sources made available by 
 * the National Centre for Supercomputer Applications (NCSA) and Clarkson 
 * University. 
 * 
 */ 
 
#ifdef OLD 
#define sock_Read       sock_read 
#define sock_FastRead   sock_fastread 
#define sock_Write      sock_write 
#define sock_FastWrite  sock_fastwrite 
#define sock_Flush      sock_flush 
#define sock_FlushNext  sock_flushnext 
#define sock_Puts       sock_puts 
#define sock_Gets       sock_gets 
#define sock_Putc       sock_putc 
#define sock_Getc       sock_getc 
#define sock_DataReady  sock_dataready 
#define sock_Close      sock_close 
#define sock_Abort      sock_abort 
#define sock_Printf     sock_printf 
#define sock_Scanf      sock_scanf 
 
#define udp_Open        udp_open 
#define tcp_Open        tcp_open 
#define tcp_Listen      tcp_listen 
#endif OLD 
 
/* Kernal version (major major minor minor) */ 
#define WTCP_VER 0x0102 
 
/* 
 * Typedefs and constants 
 */ 
 
#ifndef byte 
typedef unsigned char byte; 
#endif  byte 
#ifndef word 
typedef unsigned int word; 
#endif  word 
#ifndef longword 
typedef unsigned long longword; 
#endif  longword 
 
typedef struct { 
    byte undoc[ 4300 ]; 
} tcp_Socket; 
 
typedef struct { 
    byte undoc[ 2200 ]; 
} udp_Socket; 
 
 
typedef struct sockaddr { 
    word        s_type; 
    word        s_port; 
    longword    s_ip; 
    byte        s_spares[6];    /* unused in TCP realm */ 
}; 
 
 
#define MAX_COOKIES     10 
#define MAX_NAMESERVERS 10 
 
#define TCP_MODE_BINARY 0 
#define TCP_MODE_ASCII	1 
#define UDP_MODE_CHK	0	/*default to checksum */ 
#define UDP_MODE_NOCHK	2 
#define TCP_MODE_NAGLE  0       /* Nagle algorithm */ 
#define TCP_MODE_NONAGLE 4 
 
sock_init(); 
/* 
 *   s is the pointer to a udp or tcp socket 
 */ 
sock_read(void  *s, byte *dp, int len ); 
sock_fastread(void  *s, byte *dp, int len ); 
sock_write(void  *s, byte *dp, int len); 
void sock_enqueue(void  *s, byte *dp, int len); 
sock_fastwrite(void *s, byte *dp, int len ); 
sock_flush( void  *s ); 
sock_flushnext( void  *s); 
sock_puts( void  *s, byte *dp ); 
word sock_gets( void  *s, byte *dp, int n ); 
byte sock_putc( void  *s, byte c ); 
byte sock_getc( void  *s ); 
word sock_dataready( void  *s ); 
sock_close( void *s ); 
sock_abort( void *s ); 
sock_printf( void  *s, char *format, ... ); 
sock_scanf( void  *s, char *format, ... ); 
sock_mode( void *s, word mode );	/* see TCP_MODE_... */ 
db_write( char *msg ); 
dbuginit(); 
 
/* 
 * TCP or UDP specific stuff, must be used for open's and listens, but 
 * sock stuff is used for everything else 
 */ 
int udp_open(void *s, word lport, longword ina, word port, int (*datahandler)()); 
int tcp_open(void *s, word lport, longword ina, word port, int (*datahandler)()); 
tcp_listen(void *s, word lport, longword ina, word port, int (*datahandler)(), word timeout); 
int tcp_established(void *s); 
 
char *rip( char *s ); 
longword resolve( char *name); 
/* 
 * less general functions 
 */ 
longword aton( char *text ); 
int isaddr( char *text ); 
tcp_cbreak( word mode ); 
longword intel( longword x ); 
word intel16( word x ); 
 
/* 
 * timers 
 */ 
 
void ip_timer_init( void *s , word delayseconds ); 
word ip_timer_expired( void *s ); 
 
 
 
        /* 
         * TCP/IP system variables - do not change these since they 
         *      are not necessarily the source variables, instead use 
         *      ip_Init function 
         */ 
extern longword my_ip_addr; 
extern longword sin_mask;       /* eg.  0xfffffe00L */ 
extern word sock_delay; 
 
        /* 
         * tcp_init/tcp_shutdown 
         *      - init/kill all tcp and lower services 
         *      - only call if you do not use sock_init 
         * (NOT RECOMMENDED) 
         */ 
tcp_shutdown(); 
tcp_Init(); 
 
/* 
 * things you probably won't need to know about 
 */ 
	/* 
	 * sock_debugdump 
	 *	- dump some socket control block parameters 
	 * used for testing the kernal, not recommended 
	 */ 
sock_debugdump( void *s); 
        /* 
         * tcp_config - read a configuration file 
         *            - if special path desired, call after sock_init() 
         *            - null reads path from executable 
         * see sock_init(); 
         */ 
tcp_config( char *path ); 
        /* 
         * tcp_tick - called periodically by user application in sock_wait_... 
         *          - returns 1 when our socket closes 
         */ 
tcp_tick( void *s ); 
        /* 
         * Retransmitter - called periodically to perform tcp retransmissions 
         *          - normally called from tcp_tick, you have to be pretty 
         *            low down to use this one 
         */ 
tcp_Retransmitter(); 
        /* 
         * tcp_set_debug_state - set 1 or reset 0 - depends on what I have done 
         */ 
tcp_set_debug_state( word x ); 
 
 
extern int _last_cookie; 
extern longword _cookie[MAX_COOKIES]; 
 
        /* 
         * name domain constants 
         */ 
 
extern char *def_domain; 
extern longword def_nameservers[ MAX_NAMESERVERS ]; 
 
 
extern word wathndlcbrk; 
extern word watcbroke; 
/* 
 * sock_wait_... macros 
 */ 
/* 
 * sock_wait_established() 
 *	- waits then aborts if timeout on s connection 
 * sock_wait_input() 
 *	- waits for received input on s 
 *	- may not be valid input for sock_Gets... check returned length 
 * sock_tick() 
 *	- do tick and jump on abort 
 * sock_wait_closed(); 
 *	- discards all received data 
 * 
 * jump to sock_err with contents of *statusptr set to 
 *	 1 on closed 
 *	-1 on timeout 
 * 
 */ 
int _ip_delay0( void *s, int seconds, int (*fn)(), void *statusptr ); 
int _ip_delay1( void *s, int seconds, int (*fn)(), void *statusptr ); 
int _ip_delay2( void *s, int seconds, int (*fn)(), void *statusptr ); 
 
unsigned long set_timeout( unsigned int seconds ); 
unsigned long set_ttimeout( unsigned int ticks ); 
int chk_timeout( unsigned long timeout ); 
 
 
 
int tcp_tick( void *s ); 
 
#define sock_wait_established( s, seconds, fn, statusptr ) \ 
    if (_ip_delay0( s, seconds, fn, statusptr )) goto sock_err; 
#define sock_wait_input( s, seconds, fn , statusptr ) \ 
    if (_ip_delay1( s, seconds, fn, statusptr )) goto sock_err; 
#define sock_tick( s, statusptr ) \ 
    if ( !tcp_tick(s)) { if (statusptr) *statusptr = 1 ; goto sock_err; } 
#define sock_wait_closed(s, seconds, fn, statusptr )\ 
    if (_ip_delay2( s, seconds, fn, statusptr )) goto sock_err; 
 
/* user initialization file */ 
extern void (*usr_init)(); 
 
void outs( char far * string ); 
longword aton( char * string); 
int _ping( longword host , longword countnum ); 
longword _chk_ping( longword host , longword *ptr); 
void _arp_register( longword use, longword instead_of ); 
 
 
 
void _eth_init(); 
byte *_eth_formatpacket( void *eth_dest, word eth_type ); 
void _eth_send( word len); 
void _eth_free( void *buf); 
byte *_eth_arrived( word *type_ptr); 
void _eth_release(); 
 
 
 
/* bsd-similar stuff */ 
 
int sock_rbsize( void *s ); 
int sock_rbused( void *s ); 
int sock_rbleft( void *s ); 
int sock_tbsize( void *s ); 
int sock_tbused( void *s ); 
int sock_tbleft( void *s ); 
 
 
_chk_socket( tcp_Socket *s ); 
char *inet_ntoa( char *s, longword x ); 
char *psocket( tcp_Socket *s ); 
longword inet_addr( char *s ); 
char *sockerr( tcp_Socket *s ); 
char *sockstate( tcp_Socket *s ); 
getpeername( tcp_Socket *s, void *dest, int *len ); 
getsockname(  tcp_Socket *s, void *dest, int *len ); 
longword gethostid(); 
longword sethostid( longword ip ); 
char *getdomainname( char *name, int length ); 
char *setdomainname( char *string ); 
char *gethostname( char *name, int length ); 
char *sethostname( char *string ); 
word ntohs( word a ); 
word htons( word a ); 
longword ntohl( longword x ); 
longword htonl( longword x ); 
 
void _arp_register( longword use, longword instead_of ); 
int _arp_resolve( longword ina, void *ethap); 
 
extern _survivebootp; 
 
sock_stats( tcp_Socket *s, word *days, word *inactive, word *cwindow, word *avg, word *sd );