📄 slpd_incoming.c
字号:
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 + -