⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ss.c

📁 speech signal process tools
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Simple Socket Libary   Written by Mat Watson and Hubert Bartels.  12/01/90*//*Copyright (c) 1990 Mat Watson and Hubert Bartels. All rights reserved. Permission to use, copy, and/or distribute for any purpose and without fee is hereby granted, provided that both the above copyright notice and this permission notice appear in all copies and derived works. Fees for distribution of this software or for derived sources may only be charged with the express written permission of the copyright holders. This software is provided ``as is'' without express or implied warranty.*/#include <esps/ss.h>#ifdef M5600#define OLD_BSD_FDSETS#include <esps/ultrix_cpt.h>#endifstatic char *sccs_id = "%W% %G%	ERL";/* #include "private_globals.h" *//* #include <signal.h> */int ss_server_flag;int ss_client_flag;int ss_init_flag=0;SOCKARRAY ss_sockbuff;int max_sd;  /* this variable is a private global */#ifdef APOLLO_68Kint _SockFlsbuf();void SockInit();#endif#ifndef DEC_ALPHAchar *malloc();char *calloc();#endifSOCKET *AcceptSock( ssp )SOCKET *ssp;               /* Server Socket Pointer */{  SOCKET *csp;             /* Client Socket Pointer */  struct sockaddr *adrp;   /* Address Poiner        */  int *adrlen;             /* Address Length        */  int csd;                 /* Client Socket Descriptor */  if( !(ss_sockbuff.n_sockets < MaxSockets) )    return (SOCKET *) SS_NULL;  /* Allocate space for the client's socket structure */  csp = (SOCKET *)malloc( sizeof( SOCKET ));  if( !csp )    sserror("AcceptSock: malloc()",EXIT);  csp->_rcnt = 0;  csp->_rptr = SS_NULL;  csp->_rbase = SS_NULL;  csp->_wcnt = 0;  csp->_wptr = SS_NULL;  csp->_wbase = SS_NULL;  csp->_flag = 0;  adrp = (struct sockaddr *)0;  adrlen = (int *)0;  csd = accept( ssp->sd, adrp, adrlen );  if( csd < 0 ) {#ifdef Verbose_Errors    sserror("AcceptSock: accept()",CONT);#endif    return SS_NULL;  }  /* Set the value of the maximum socket descriptor used so far */  max_sd = csd >= max_sd ? csd : max_sd;    csp->sd = csd;  AddSock( csp, &ss_sockbuff );  /* Return a pointer to the client socket */  return csp;}void AddSock( sp, sap )SOCKET *sp;SOCKARRAY *sap;{  int n;  n = sap->n_sockets;  sap->n_sockets++;  sap->spa[n] = sp;  return;}SOCKET *ConnectSock( hostname, port_number )char *hostname;unsigned port_number;{  SOCKET *sp;  struct hostent *hep;  struct sockaddr *adrp;  int adrlen;  int result;  SockInit( 'c' );  sp = (SOCKET *) malloc( sizeof( SOCKET ) );  if( !sp ) {#ifdef Verbose_Errors    sserror("ConnectSock: malloc()",CONT);#endif    return (SOCKET *) SS_NULL;  }  sp->_rcnt = 0;  sp->_rptr = SS_NULL;  sp->_rbase = SS_NULL;  sp->_wcnt = 0;  sp->_wptr = SS_NULL;  sp->_wbase = SS_NULL;  sp->_flag = 0;  AddSock( sp, &ss_sockbuff );  hep = gethostbyname( hostname );  if( hep == (struct hostent *)0 ) {#ifdef Verbose_Errors    perror("ConnectSock: gethostbyname()");#endif    return (SOCKET *) SS_NULL;  }  bcopy( (char *)(hep->h_addr), (char *)&(sp->addr.sin_addr), hep->h_length );  sp->addr.sin_family = AF_INET;  sp->addr.sin_port = htons( (u_short)port_number );  sp->sd = socket( AF_INET, SOCK_STREAM, 0 );  if( sp->sd < 0 ) {#ifdef Verbos_Errors    sserror("ConnectSock: socket()",CONT);#endif    return (SOCKET *) SS_NULL;  }  adrp = (struct sockaddr *) &(sp->addr);  adrlen = sizeof( sp->addr );  result = connect( sp->sd, adrp, adrlen );  if( result < 0 ) {#ifdef Verbos_Errors    sserror("ConnectSock: connect()",CONT);#endif    close(sp->sd);    free((char *) sp );    return (SOCKET *) SS_NULL;  }  max_sd = sp->sd >= max_sd ? sp->sd : max_sd ;  return sp;}int IsExceptSet( sp )SOCKET *sp;{  int result, i;  SOCKARRAY * sap;  sap = &ss_sockbuff;  i = SockIndex( sp, sap );  if( i == -1 )    return -1;           /* Socket is not in ss_sockbuff */  result = FD_ISSET( sap->spa[i]->sd, &(sap->exceptfds) );  return result;}int IsReadSet( sp )SOCKET *sp;{  int result, i;  SOCKARRAY * sap;  sap = &ss_sockbuff;  i = SockIndex( sp, sap );  if( i == -1 )    return i;               /* Socket is not in the ss_sockbuff */  result = FD_ISSET( sap->spa[i]->sd, &(sap->readfds) );  return result;}int IsWriteSet( sp )SOCKET *sp;{  int result, i;  SOCKARRAY * sap;  sap = &ss_sockbuff;  i = SockIndex( sp, sap );  if( i == -1 )    return -1;    /* Socket is not in ss_sockbuff */  result = FD_ISSET( sap->spa[i]->sd, &(sap->writefds) );  return result;}void RemoveSock( sp )SOCKET *sp;{  int i, n;  SOCKARRAY *sap;  sap = &ss_sockbuff;  for( i = 0; i < sap->n_sockets; i++ )     if( sp == sap->spa[i] ) break;  n = i;  for( i = n + 1; i < sap->n_sockets; i++ )    sap->spa[i-1] = sap->spa[i];  sap->spa[sap->n_sockets - 1] = SS_NULL;  sap->n_sockets--;  return;}SOCKET *ServerSock( port_number )unsigned port_number;{  int sd;  int optval;  unsigned optlen;  SOCKET *sp;  int result;  SockInit( 's' );  sd = socket( AF_INET, SOCK_STREAM, 0 );  if( sd < 0 ) {/* sserror("ServerSock: socket()",EXIT); */   return (SOCKET *) SS_NULL;   }    optval = 1;  /* any nonzero value will cause the flag to be set */  optlen = sizeof( int );  result = setsockopt( sd, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, optlen );  if( result != 0 ) {#ifdef Verbose_Errors    sserror("ServerSock: setsockopt()",CONT);#endif    return (SOCKET *) SS_NULL;  }  sp = (SOCKET *)malloc( sizeof(SOCKET));  if( !sp ) {#ifdef Verbose_Errors    sserror("ServerSock: mallock()",CONT);#endif    return (SOCKET *) SS_NULL;  }    sp->addr.sin_family = AF_INET;  sp->addr.sin_addr.s_addr = INADDR_ANY;  sp->addr.sin_port = htons( (u_short)port_number );  result = bind( sd, (struct sockaddr *)&(sp->addr), sizeof(struct sockaddr));  if( result !=0 ) {#ifdef Verbose_Errors    sserror("ServerSock: bind()",CONT);#endif    return (SOCKET *) SS_NULL;  }  max_sd = sd >= max_sd ? sd : max_sd;  sp->sd = sd;  sp->_rcnt = 0;  sp->_rptr = SS_NULL;  sp->_rbase = SS_NULL;  sp->_wcnt = 0;  sp->_wptr = SS_NULL;  sp->_wbase = SS_NULL;  sp->_flag = 0;    result = listen( sd, 5 );  if( result != 0 ) {#ifdef Verbose_Errors    sserror("ServerSock: listen()",CONT);#endif    return (SOCKET *) SS_NULL;  }  AddSock( sp, &ss_sockbuff );    return sp;}void SockArrayInit( sap )SOCKARRAY *sap;{  int i;  sap->n_sockets = 0;  for( i = 0; i < MaxSockets; i++ )    sap->spa[i] = SS_NULL;  return;}/*	fclose.c		Hubert Bartels		August 8, 1985		fclose closes the file and frees the entry in the _iob block.        Modified for sockets by Mat Watson 12/1/90*/int SockClose(sp)SOCKET *sp;{	int result;  RemoveSock( sp );  result = SockFlush(sp);      /* Flush the buffer if needed */  if( result < 0 ) {#ifdef Verbose_Errors    sserror("SockClose(): SockFlush failed",CONT);#endif    return SS_EOF;  }  result = close((int)sp->sd);		/* Close the file */  if( result < 0 )    sserror("SockClose: close() failed",EXIT);  sp->sd = '\0';  sp->_rcnt = 0;  sp->_rptr = SS_NULL;  if( (sp->_flag & SS_IONBF) == 0 )     if(sp->_rbase)      free((char *)sp->_rbase);  sp->_rbase = SS_NULL;  sp->_wcnt = 0;  sp->_wptr = SS_NULL;  if( (sp->_flag & SS_IONBF) == 0 )     if(sp->_wbase)      free((char *) sp->_wbase );  sp->_wbase = SS_NULL;  sp->_flag = 0;  return 0; /* Success */}/* SockFilbuf.c   Modified for sockets by Mat Watson 12/01/90*//*	filbuf.c		Hubert Bartels		July 8, 1985		filbuf is used to fill the buffer of files being read by the	polyp. As such, it is part of the file system of the polyp.*/int _SockFilbuf(sp)SOCKET *sp;{  static char smallbuf[NOFILE];  /* for unbuffered i/o */  if( (sp->_flag & (SS_IOEOF | SS_IOERR)) != 0 )    return(SS_EOF);  while (sp->_rbase == SS_NULL) /* find buffer space */    if(sp->_flag & SS_IONBF) /* unbuffered */      sp->_rbase = &smallbuf[sp->sd];    else if ((sp->_rbase = calloc(SS_BUFSIZ, 1)) == SS_NULL)      sp->_flag |= SS_IONBF;	/* Cannot get unbuffered */    else      sp->_flag |= SS_IOMYBUF;	/* Got a big buffer */  sp->_rptr = sp->_rbase;  sp->_rcnt = read(sp->sd, sp->_rptr,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -