Beispiel #1
0
VOID
CNdasIXBcast::ResetBind(HANDLE hStopEvent)
{
	BOOL fSuccess = FALSE;

	if (NULL != m_lpSocketAddressList) 
	{
		::LocalFree(m_lpSocketAddressList);
		m_lpSocketAddressList = NULL;
	}

	while (NULL == m_lpSocketAddressList) 
	{
		m_lpSocketAddressList = pCreateLocalLpxAddressList();
		if (NULL == m_lpSocketAddressList) 
		{
			XTLTRACE2(NDASSVC_IX, TRACE_LEVEL_ERROR,
				"Getting local lpx address list failed. Retry in 5 sec, error=0x%X\n",
				GetLastError());
			// try to get address list again in 5 sec
			// we should terminate this routine at a task terminate event
			DWORD dwWaitResult = ::WaitForSingleObject(hStopEvent, 5000);
			if (WAIT_OBJECT_0 == dwWaitResult) 
			{
				return;
			}
		}
	}
	
	fSuccess = m_sockAddrChangeNotifier.Reset();
	if (!fSuccess) 
	{
		XTLTRACE2(NDASSVC_IX, TRACE_LEVEL_ERROR,
			"Resetting sockAddrChangeNotifier failed, error=0x%X\n",
			GetLastError());
	}

	DWORD nLocalAddrs =
		min((DWORD)m_lpSocketAddressList->iAddressCount, m_nSenders);

	for (DWORD i = 0; i < m_nSenders; ++i) {
		if (INVALID_SOCKET != (SOCKET)m_senders[i]) {
			m_senders[i].Close();
		}
	}

	for (DWORD i = 0; i < nLocalAddrs && i < m_nSenders; ++i) {

		PSOCKADDR_LPX pSockAddr = (PSOCKADDR_LPX)
			m_lpSocketAddressList->Address[i].lpSockaddr;
		pSockAddr->LpxAddress.Port = 0;

		fSuccess = m_senders[i].Create();
		if (!fSuccess) {
			XTLTRACE2(NDASSVC_IX, TRACE_LEVEL_ERROR,
				"Creating a socket failed, index=%d, error=0x%X\n",
				i, GetLastError());
			continue;
		}

		//
		// This is a broadcast socket
		//
		BOOL bBroadcast = TRUE;
		fSuccess = m_senders[i].SetSockOpt(
			SO_BROADCAST, 
			(CONST BYTE*)&bBroadcast, 
			sizeof(BOOL));

		if (!fSuccess) 
		{
			XTLTRACE2(NDASSVC_IX, TRACE_LEVEL_ERROR,
				"Setting a sock option to broadcast failed, index=%d, error=0x%X\n",
				i, GetLastError());
			(VOID) m_senders[i].Close();
			continue;
		}

		fSuccess = m_senders[i].Bind(pSockAddr);
		if (!fSuccess) 
		{
			XTLTRACE2(NDASSVC_IX, TRACE_LEVEL_ERROR,
				"Binding failed, index=%d, address=%s, error=0x%X\n",
				i, CSockLpxAddr(pSockAddr).ToStringA(), GetLastError());
			(VOID) m_senders[i].Close();
			continue;
		}
	}

}
Beispiel #2
0
VOID
CNdasIXBcast::ResetBind()
{
	BOOL fSuccess = FALSE;

	if (NULL != m_lpSocketAddressList) {
		::LocalFree(m_lpSocketAddressList);
		m_lpSocketAddressList = NULL;
	}

	while (NULL == m_lpSocketAddressList) {
		m_lpSocketAddressList = pCreateLocalLpxAddressList();
			if (NULL == m_lpSocketAddressList) {
			DBGPRT_WARN_EX(_FT("Getting local lpx address list failed. Retry in 5 sec: "));
			// try to get address list again in 5 sec
			// we should terminate this routine at a task terminate event
			DWORD dwWaitResult = ::WaitForSingleObject(m_hTaskTerminateEvent, 5000);
			if (WAIT_OBJECT_0 == dwWaitResult) {
				return;
			}
		}
	}
	
	fSuccess = m_sockAddrChangeNotifier.Reset();
	// _ASSERTE(fSuccess);
	if (!fSuccess) {
		DBGPRT_WARN(_FT("Resetting sockAddrChangeNotifier failed: "));
	}

	DWORD nLocalAddrs =
		min((DWORD)m_lpSocketAddressList->iAddressCount, m_nSenders);

	for (DWORD i = 0; i < m_nSenders; ++i) {
		if (INVALID_SOCKET != (SOCKET)m_senders[i]) {
			m_senders[i].Close();
		}
	}

	for (DWORD i = 0; i < nLocalAddrs && i < m_nSenders; ++i) {

		PSOCKADDR_LPX pSockAddr = (PSOCKADDR_LPX)
			m_lpSocketAddressList->Address[i].lpSockaddr;
		pSockAddr->LpxAddress.Port = 0;

		fSuccess = m_senders[i].Create();
		if (!fSuccess) {
			DBGPRT_ERR_EX(_FT("Creating a socket failed: "));
			continue;
		}

		//
		// This is a broadcast socket
		//
		BOOL bBroadcast = TRUE;
		fSuccess = m_senders[i].SetSockOpt(
			SO_BROADCAST, 
			(CONST BYTE*)&bBroadcast, 
			sizeof(BOOL));

		if (!fSuccess) {
			DBGPRT_ERR_EX(_FT("Setting a sock option to broadcast failed: "));
			(VOID) m_senders[i].Close();
			continue;
		}

		fSuccess = m_senders[i].Bind(pSockAddr);
		if (!fSuccess) {
			DBGPRT_ERR_EX(_FT("Binding a sock %d to %s failed: "),
				i, CSockLpxAddr(pSockAddr).ToString());
			(VOID) m_senders[i].Close();
			continue;
		}
	}

}