HRESULT StartListening() { HRESULT hr = S_OK; LogMessage("StartListening: started"); // // enumerate available addresses // IEnumAddress *pEnumAddress = NULL; hr = g_pTapi->EnumerateAddresses( &pEnumAddress ); if (FAILED(hr)) { LogError("StartListening: Failed to enumerate addresses"); return hr; } // // this flag remains false until we succeded starting listening on at // least one address // BOOL bListenStarted = FALSE; // // walk through all the addresses and start listening on the ones that // support audio // while (TRUE) { // // check the next address // ITAddress *pAddress = NULL; hr = pEnumAddress->Next(1, &pAddress, NULL); if (S_OK != hr) { // // no more addresses or error // break; } // // log the name of the address // BSTR bstrAddressName; hr = pAddress->get_AddressName(&bstrAddressName); if (SUCCEEDED(hr)) { LogMessage("StartListening: -> found address [%S]", bstrAddressName); SysFreeString(bstrAddressName); } else { LogError("StartListening: failed to get address name"); } // // if the address supports audio and media streaming terminal, // start listening // if ( AddressSupportsAudio(pAddress) && AddressSupportsMST(pAddress) ) { // // start listening on this address // LogMessage("StartListening: Starting listening."); hr = ListenOnAddress(pAddress); if (SUCCEEDED(hr)) { // // we are listening on at least one address // bListenStarted = TRUE; LogMessage("StartListening: " "-> started listening on this address"); } else { // // log an error and continue // LogError("StartListening: -> failed starting listening on this address, " "hr = 0x%lx", hr); } } else { LogMessage("StartListening: -> no audio or MST support on this address."); } pAddress->Release(); pAddress = NULL; } pEnumAddress->Release(); pEnumAddress = NULL; // // depending on whether we started listening or not, log a message and // return the appropriate error code. // if (bListenStarted) { LogMessage("StartListening: completed. " "Listening on one or more addresses"); return S_OK; } else { LogMessage("StartListening: completed. Not listening on any address."); return E_FAIL; } }
int AddSocketAddress(char* addr) { SOCKET *s = SocketList + numsockets; int rc, result; size_t len = strlen(addr) + 1; if (len > 256) return FALSE; char *addrcopy = alloca(len); memcpy(addrcopy, addr, len); char *szHost = addrcopy; char *szPort = defaultport; char *lastcolon = strrchr(addrcopy, ':'); char *firstcolon = strchr(addrcopy, ':'); char *closingbracket = strstr(addrcopy, "]:"); if (*addrcopy == '[' && closingbracket) //IPv6 address with port { *closingbracket = 0; szHost++; szPort = closingbracket + 2; } else if (firstcolon && firstcolon == lastcolon) //IPv4 address with port { *firstcolon = 0; szPort = firstcolon + 1; } struct addrinfo hints; struct addrinfo *saList, *sa; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST; if ((rc = getaddrinfo(szHost, szPort, &hints, &saList))) { fprintf(stderr, "Warning: %s: %s\n", addr, gai_strerror(rc)); return FALSE; } for (sa = saList; sa; sa = sa->ai_next) { // struct sockaddr_in* addr4 = (struct sockaddr_in*)sa->ai_addr; // struct sockaddr_in6* addr6 = (struct sockaddr_in6*)sa->ai_addr; if (sa->ai_family != AF_INET && sa->ai_family != AF_INET6) continue; if (!ListenOnAddress(sa, s, szHost, szPort)) { numsockets++; result = TRUE; } } freeaddrinfo(saList); return result; }