#include #include #include #include #include #include #include #include #include struct itlst { int length; struct sockaddr_in * hst; int * retlen; }; $DESCRIPTOR(dsc_ucxdev,"UCX$DEVICE"); int netio_close ( short chan ) { return sys$dassgn (chan); } int netio_open ( short port, short * chan ) { int status; struct { short proto; char type; char domain; } sck_parm = {UCX$C_UDP,INET_PROTYP$C_DGRAM,UCX$C_AF_INET}; iosb netiosb; struct sockaddr_in local_host= {UCX$C_AF_INET,0,UCX$C_INADDR_ANY}; struct itlst lhst_adrs = {sizeof(local_host),&local_host}; local_host.sin_port = htons(port); /* ** */ status = sys$assign( &dsc_ucxdev,chan,0,0); if ( !(status & 1) ) lib$signal(status); /* ** */ status = sys$qiow (0,*chan,IO$_SETMODE,&netiosb,0,0,&sck_parm,0,&lhst_adrs,0,0,0); if ( !(status & 1) ) lib$signal(status); if ( !(netiosb.iosb$w_status & 1) ) return netio_close (*chan); return status; } int netio_read ( short chan, char *buf, short buflen, short *retlen, struct sockaddr_in *remhost ) { int status; iosb netiosb; int remhostlen = 0; struct itlst rsck_adrs = {sizeof(struct sockaddr_in),remhost,&remhostlen}; /* ** */ status = sys$qiow (0,chan,IO$_READVBLK,&netiosb,0,0,buf,buflen,&rsck_adrs,0,0,0); if ( !(status & 1) ) return status; if ( !(netiosb.iosb$w_status & 1) ) return netiosb.iosb$w_status; *retlen = netiosb.iosb$w_bcnt; return status; } int netio_write ( short chan, char *buf, short buflen, struct sockaddr_in *remhost ) { int status; iosb netiosb; int remhostlen = 0; struct itlst rsck_adrs = {sizeof(struct sockaddr_in),remhost,&remhostlen}; /* ** */ status = sys$qiow (0,chan,IO$_WRITEVBLK,&netiosb,0,0,buf,buflen,&rsck_adrs,0,0,0); if ( !(status & 1) ) return status; if ( !(netiosb.iosb$w_status & 1) ) return netiosb.iosb$w_status; return status; } /* void main (void) { int status; short chan,retlen; struct sockaddr_in remhost; char buf [ 512 ]; status = netio_open (1965,&chan); if ( !(status & 1) ) lib$signal(status); while ( 1 & (status = netio_read (chan,buf,sizeof(buf),&retlen,&remhost)) ) { printf ("%.*s from:", retlen,buf); printf ("remote port %d\n",ntohs(remhost.sin_port)); printf ("remote addr %s\n",inet_ntoa(remhost.sin_addr)); } status = netio_close (chan); if ( !(status & 1) ) lib$signal(status); } */