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

📄 listen.c

📁 ipp打印机服务器原代码 注意:请将ipp.gz改为ipp.tar.gz 然后使用tar zxvf ipp.tar.gz解压 站长注意
💻 C
字号:
/* * "$Id: listen.c,v 1.26 2005/01/03 19:29:59 mike Exp $" * *   Server listening routines for the Common UNIX Printing System (CUPS) *   scheduler. * *   Copyright 1997-2005 by Easy Software Products, all rights reserved. * *   These coded instructions, statements, and computer programs are the *   property of Easy Software Products and are protected by Federal *   copyright law.  Distribution and use rights are outlined in the file *   "LICENSE.txt" which should have been included with this file.  If this *   file is missing or damaged please contact Easy Software Products *   at: * *       Attn: CUPS Licensing Information *       Easy Software Products *       44141 Airport View Drive, Suite 204 *       Hollywood, Maryland 20636 USA * *       Voice: (301) 373-9600 *       EMail: cups-info@cups.org *         WWW: http://www.cups.org * * Contents: * *   PauseListening()  - Clear input polling on all listening sockets... *   ResumeListening() - Set input polling on all listening sockets... *   StartListening()  - Create all listening sockets... *   StopListening()   - Close all listening sockets... *//* * Include necessary headers... */#include "cupsd.h"/* * 'PauseListening()' - Clear input polling on all listening sockets... */voidPauseListening(void){  int		i;		/* Looping var */  listener_t	*lis;		/* Current listening socket */  if (NumListeners < 1 || !FD_ISSET(Listeners[0].fd, InputSet))    return;  if (NumClients == MaxClients)    LogMessage(L_WARN, "Max clients reached, holding new connections...");  LogMessage(L_DEBUG, "PauseListening: clearing input bits...");  for (i = NumListeners, lis = Listeners; i > 0; i --, lis ++)  {    LogMessage(L_DEBUG2, "PauseListening: Removing fd %d from InputSet...",               lis->fd);    FD_CLR(lis->fd, InputSet);  }}/* * 'ResumeListening()' - Set input polling on all listening sockets... */voidResumeListening(void){  int		i;		/* Looping var */  listener_t	*lis;		/* Current listening socket */  if (NumListeners < 1 || FD_ISSET(Listeners[0].fd, InputSet))    return;  if (NumClients >= (MaxClients - 1))    LogMessage(L_WARN, "Resuming new connection processing...");  LogMessage(L_DEBUG, "ResumeListening: setting input bits...");  for (i = NumListeners, lis = Listeners; i > 0; i --, lis ++)  {    LogMessage(L_DEBUG2, "ResumeListening: Adding fd %d to InputSet...",               lis->fd);    FD_SET(lis->fd, InputSet);  }}/* * 'StartListening()' - Create all listening sockets... */voidStartListening(void){  int		i,		/* Looping var */		val;		/* Parameter value */  listener_t	*lis;		/* Current listening socket */  struct hostent *host;		/* Host entry for server address */  LogMessage(L_DEBUG, "StartListening: NumListeners=%d", NumListeners); /*  * Get the server's IP address...  */  memset(&ServerAddr, 0, sizeof(ServerAddr));  if ((host = httpGetHostByName(ServerName)) != NULL)  {   /*    * Found the server's address!    */    memcpy((char *)&(ServerAddr.sin_addr), host->h_addr, host->h_length);    ServerAddr.sin_family = host->h_addrtype;  }  else  {   /*    * Didn't find it!  Use an address of 0...    */    LogMessage(L_ERROR, "StartListening: Unable to find IP address for server name \"%s\" - %s\n",               ServerName, hstrerror(h_errno));    ServerAddr.sin_family = AF_INET;  } /*  * Setup socket listeners...  */  for (i = NumListeners, lis = Listeners, LocalPort = 0; i > 0; i --, lis ++)  {    LogMessage(L_DEBUG, "StartListening: address=%08x port=%d",               (unsigned)ntohl(lis->address.sin_addr.s_addr),	       ntohs(lis->address.sin_port));   /*    * Save the first port that is bound to the local loopback or    * "any" address...    */    if (!LocalPort &&        (ntohl(lis->address.sin_addr.s_addr) == 0x7f000001 ||         ntohl(lis->address.sin_addr.s_addr) == 0x00000000))    {      LocalPort       = ntohs(lis->address.sin_port);      LocalEncryption = lis->encryption;    }   /*    * Create a socket for listening...    */    if ((lis->fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)    {      LogMessage(L_ERROR, "StartListening: Unable to open listen socket for address %08x:%d - %s.",                 (unsigned)ntohl(lis->address.sin_addr.s_addr),		 ntohs(lis->address.sin_port), strerror(errno));      exit(errno);    }    fcntl(lis->fd, F_SETFD, fcntl(lis->fd, F_GETFD) | FD_CLOEXEC);   /*    * Set things up to reuse the local address for this port.    */    val = 1;#ifdef __sun    setsockopt(lis->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));#else    setsockopt(lis->fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));#endif /* __sun */   /*    * Bind to the port we found...    */    if (bind(lis->fd, (struct sockaddr *)&(lis->address), sizeof(lis->address)) < 0)    {      LogMessage(L_ERROR, "StartListening: Unable to bind socket for address %08x:%d - %s.",                 (unsigned)ntohl(lis->address.sin_addr.s_addr),		 ntohs(lis->address.sin_port), strerror(errno));      exit(errno);    }   /*    * Listen for new clients.    */    if (listen(lis->fd, ListenBackLog) < 0)    {      LogMessage(L_ERROR, "StartListening: Unable to listen for clients on address %08x:%d - %s.",                 (unsigned)ntohl(lis->address.sin_addr.s_addr),		 ntohs(lis->address.sin_port), strerror(errno));      exit(errno);    }  } /*  * Make sure that we are listening on localhost!  */  if (!LocalPort)  {    LogMessage(L_EMERG, "No Listen or Port lines were found to allow access via localhost!");   /*    * Commit suicide...    */    kill(getpid(), SIGTERM);  }  ResumeListening();}/* * 'StopListening()' - Close all listening sockets... */voidStopListening(void){  int		i;		/* Looping var */  listener_t	*lis;		/* Current listening socket */  LogMessage(L_DEBUG, "StopListening: closing all listen sockets.");  PauseListening();  for (i = NumListeners, lis = Listeners; i > 0; i --, lis ++)#ifdef WIN32    closesocket(lis->fd);#else    close(lis->fd);#endif /* WIN32 */}/* * End of "$Id: listen.c,v 1.26 2005/01/03 19:29:59 mike Exp $". */

⌨️ 快捷键说明

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