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

📄 slpd_incoming.c

📁 SLP协议在linux下的实现。此版本为1.2.1版。官方网站为www.openslp.org
💻 C
📖 第 1 页 / 共 2 页
字号:
                         fd_set* readfds,                         fd_set* writefds)/* Handles all outgoing requests that are pending on the specified file    *//* discriptors                                                             *//*                                                                         *//* fdcount  (IN/OUT) number of file descriptors marked in fd_sets          *//*                                                                         *//* readfds  (IN) file descriptors with pending read IO                     *//*                                                                         *//* writefds  (IN) file descriptors with pending read IO                    *//*=========================================================================*/{    SLPDSocket* sock;    sock = (SLPDSocket*) G_IncomingSocketList.head;    while (sock && *fdcount)    {        if (FD_ISSET(sock->fd,readfds))        {            switch (sock->state)            {            case SOCKET_LISTEN:                IncomingSocketListen(&G_IncomingSocketList,sock);                break;            case DATAGRAM_UNICAST:            case DATAGRAM_MULTICAST:            case DATAGRAM_BROADCAST:                IncomingDatagramRead(&G_IncomingSocketList,sock);                break;                                  case STREAM_READ:            case STREAM_READ_FIRST:                IncomingStreamRead(&G_IncomingSocketList,sock);                break;            default:                break;            }            *fdcount = *fdcount - 1;        }        else if (FD_ISSET(sock->fd,writefds))        {            switch (sock->state)            {            case STREAM_WRITE:            case STREAM_WRITE_FIRST:                IncomingStreamWrite(&G_IncomingSocketList,sock);                break;            default:                break;            }            *fdcount = *fdcount - 1;        }        sock = (SLPDSocket*)sock->listitem.next;     }                               }/*=========================================================================*/void SLPDIncomingAge(time_t seconds)/*=========================================================================*/{    SLPDSocket* del  = 0;    SLPDSocket* sock = (SLPDSocket*)G_IncomingSocketList.head;    while (sock)    {        switch (sock->state)        {        case STREAM_READ_FIRST:        case STREAM_READ:        case STREAM_WRITE_FIRST:        case STREAM_WRITE:            if (G_IncomingSocketList.count > SLPD_COMFORT_SOCKETS)            {                /* Accellerate ageing cause we are low on sockets */                if (sock->age > SLPD_CONFIG_BUSY_CLOSE_CONN)                {                    del = sock;                }            }            else            {                if (sock->age > SLPD_CONFIG_CLOSE_CONN)                {                    del = sock;                }            }            sock->age = sock->age + seconds;            break;        default:            /* don't age the other sockets at all */            break;        }        sock = (SLPDSocket*)sock->listitem.next;        if (del)        {            SLPDSocketFree((SLPDSocket*)SLPListUnlink(&G_IncomingSocketList,(SLPListItem*)del));            del = 0;        }    }                                                 }/*=========================================================================*/int SLPDIncomingInit()/* Initialize incoming socket list to have appropriate sockets for all     *//* network interfaces                                                      *//*                                                                         *//* Returns  Zero on success non-zero on error                              *//*=========================================================================*/{    char*           begin = NULL;    char*           beginSave = NULL;    char*           end = NULL;    int             finished;    struct in_addr  myaddr;    struct in_addr  mcastaddr;    struct in_addr  bcastaddr;    struct in_addr  loaddr;    SLPDSocket*     sock;    /*------------------------------------------------------------*/    /* First, remove all of the sockets that might be in the list */    /*------------------------------------------------------------*/    while (G_IncomingSocketList.count)    {        SLPDSocketFree((SLPDSocket*)SLPListUnlink(&G_IncomingSocketList,G_IncomingSocketList.head));    }    /*--------------------------------------------------*/    /* set up address to use for loopback and broadcast */    /*--------------------------------------------------*/    loaddr.s_addr = htonl(LOOPBACK_ADDRESS);    bcastaddr.s_addr = htonl(SLP_BCAST_ADDRESS);    mcastaddr.s_addr = htonl(SLP_MCAST_ADDRESS);    /*--------------------------------------------------------------------*/    /* Create SOCKET_LISTEN socket for LOOPBACK for the library to talk to*/    /*--------------------------------------------------------------------*/    sock = SLPDSocketCreateListen(&loaddr);    if (sock)    {        SLPListLinkTail(&G_IncomingSocketList,(SLPListItem*)sock);        SLPDLog("Listening on loopback...\n");    }    else    {        SLPDLog("NETWORK_ERROR - Could not listen on loopback\n");        SLPDLog("INTERNAL_ERROR - No SLPLIB support will be available\n");    }    /*---------------------------------------------------------------------*/    /* Create sockets for all of the interfaces in the interfaces property */    /*---------------------------------------------------------------------*/    /*---------------------------------------------------------------------*/    /* Copy G_SlpdProperty.interfaces to a temporary buffer to parse the   */    /*   string in a safety way                                            */    /*---------------------------------------------------------------------*/    if (G_SlpdProperty.interfaces != NULL)    {        begin = xstrdup((char *) G_SlpdProperty.interfaces);        beginSave = begin;  /* save pointer for free() operation later */        end = begin;        finished = 0;    }    else    {        finished = 1; /* if no interface is defined,       */                      /* don't even enter the parsing loop */    }    for (; (finished == 0); begin = ++end)    {        while (*end && *end != ',') end ++;        if (*end == 0) finished = 1;        *end = 0;                      /* Terminate string. */        if (end <= begin) continue;    /* Skip empty entries */        /* begin now points to a null terminated ip address string */        myaddr.s_addr = inet_addr(begin);        /*------------------------------------------------*/        /* Create TCP_LISTEN that will handle unicast TCP */        /*------------------------------------------------*/        sock =  SLPDSocketCreateListen(&myaddr);        if (sock)        {            SLPListLinkTail(&G_IncomingSocketList,(SLPListItem*)sock);            SLPDLog("Listening on %s ...\n",inet_ntoa(myaddr));        }        /*----------------------------------------------------------------*/        /* Create socket that will handle multicast UDP.                  */        /*----------------------------------------------------------------*/        sock =  SLPDSocketCreateBoundDatagram(&myaddr,                                              &mcastaddr,                                              DATAGRAM_MULTICAST);        if (sock)        {            SLPListLinkTail(&G_IncomingSocketList,(SLPListItem*)sock);            SLPDLog("Multicast socket on %s ready\n",inet_ntoa(myaddr));        }        else        {            SLPDLog("Couldn't bind to multicast for interface %s (%s)\n",                    inet_ntoa(myaddr), strerror(errno));        }#if defined(ENABLE_SLPv1)        if (G_SlpdProperty.isDA)        {            /*------------------------------------------------------------*/            /* Create socket that will handle multicast UDP for SLPv1 DA  */            /* Discovery.                                                 */            /*------------------------------------------------------------*/            mcastaddr.s_addr = htonl(SLPv1_DA_MCAST_ADDRESS);            sock =  SLPDSocketCreateBoundDatagram(&myaddr,                                                  &mcastaddr,                                                  DATAGRAM_MULTICAST);            if (sock)            {                SLPListLinkTail(&G_IncomingSocketList,(SLPListItem*)sock);                SLPDLog("SLPv1 DA Discovery Multicast socket on %s ready\n",                        inet_ntoa(myaddr));            }        }#endif        /*--------------------------------------------*/        /* Create socket that will handle unicast UDP */        /*--------------------------------------------*/        sock =  SLPDSocketCreateBoundDatagram(&myaddr,                                              &myaddr,                                              DATAGRAM_UNICAST);        if (sock)        {            SLPListLinkTail(&G_IncomingSocketList,(SLPListItem*)sock);            SLPDLog("Unicast socket on %s ready\n",inet_ntoa(myaddr));        }    }         if (beginSave) xfree(beginSave);    /*--------------------------------------------------------*/    /* Create socket that will handle broadcast UDP           */    /*--------------------------------------------------------*/    sock =  SLPDSocketCreateBoundDatagram(&myaddr,                                          &bcastaddr,                                          DATAGRAM_BROADCAST);    if (sock)    {        SLPListLinkTail(&G_IncomingSocketList,(SLPListItem*)sock);        SLPDLog("Broadcast socket for %s ready\n", inet_ntoa(bcastaddr));    }    if (G_IncomingSocketList.count == 0)    {        SLPDLog("No usable interfaces\n");        return 1;    }    return 0;}/*=========================================================================*/int SLPDIncomingDeinit()/* Deinitialize incoming socket list to have appropriate sockets for all   *//* network interfaces                                                      *//*                                                                         *//* Returns  Zero on success non-zero on error                              *//*=========================================================================*/{    SLPDSocket* del  = 0;    SLPDSocket* sock = (SLPDSocket*)G_IncomingSocketList.head;    while (sock)    {        del = sock;        sock = (SLPDSocket*)sock->listitem.next;        if (del)        {            SLPDSocketFree((SLPDSocket*)SLPListUnlink(&G_IncomingSocketList,(SLPListItem*)del));            del = 0;        }    }     return 0;}#ifdef DEBUG/*=========================================================================*/void SLPDIncomingSocketDump()/*=========================================================================*/{}#endif

⌨️ 快捷键说明

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