//--------------------------------------------------------------------------------
bool ofxUDPManager::ConnectMcast(char* pMcast, unsigned short usPort)
{
	// associate the source socket's address with the socket
	if (!Bind(usPort))
	{
#ifdef _DEBUG
		ofLogError("ofxUDPManager") << "ConnectMcast(): couldn't bind to " << usPort;
		ofxNetworkCheckError();
#endif
		return false;
	}

	// set ttl to default
	if (!SetTTL(1))
	{
#ifdef _DEBUG
		ofLogWarning("ofxUDPManager") << "ConnectMcast(): couldn't set TTL; continuing anyway"; 
		ofxNetworkCheckError();
#endif
	}

	if (!Connect(pMcast, usPort))
	{
#ifdef _DEBUG
		ofLogError("ofxUDPManager") << " ConnectMcast(): couldn't connect to socket";
		ofxNetworkCheckError();
#endif
		return false;
	}

	// multicast connect successful
	return true;
}
//--------------------------------------------------------------------------------
bool ofxUDPManager::ConnectMcast(char* pMcast, unsigned short usPort)
{
	// associate the source socket's address with the socket
	if (!Bind(usPort))
	{
#ifdef _DEBUG
		printf("Binding socket failed! Error: %d", WSAGetLastError());
#endif
		return false;
	}

	// set ttl to default
	if (!SetTTL(1))
	{
#ifdef _DEBUG
		printf("SetTTL failed. Continue anyway. Error: %d", WSAGetLastError());
#endif
	}

	if (!Connect(pMcast, usPort))
	{
#ifdef _DEBUG
		printf("Connecting socket failed! Error: %d", WSAGetLastError ());
#endif
		return false;
	}

	// multicast connect successful
	return true;
}
Exemple #3
0
int LowTTLTest(const struct TConfig* config) {
    if (InitWriter(config->MainConfig.Device))
        return 1;
    int packetsPerTest = config->MainConfig.PacketsPerTest;
    double start = config->LowTTLConfig.Start;
    double step = config->LowTTLConfig.Step;
    int tests = config->LowTTLConfig.TestsCount;
    int testNum;
    uint32_t packetNum = 0;
    struct TUDPPacket packet;
    InitUDPPacket(&packet, &config->MainConfig);
    uint8_t payload[18];
    memset(payload, 'x', sizeof(payload));
    struct timeval tv;
    tv.tv_sec = 0;
    tv.tv_usec = 0;
    fprintf(stderr, "Low TTL test\n%4s %8s %15s\n", ColumnTest, ColumnSended, ColumnBadPackets);
    for (testNum = 0; testNum < tests; ++testNum) {
        double frenq = start + testNum*step;
        if (frenq < 0)
            frenq = 0;
        if (frenq > 1)
            frenq = 1;
        int badPackets = 0;
        int i;
        for (i = 0; i < packetsPerTest; ++i) {
            WritePacketNum(payload, packetNum);
            SetData(&packet, payload, sizeof(payload));
            if (i != 0 && i != packetsPerTest - 1 && badPackets < i*frenq) {
                SetTTL(&packet, 1);
                ++badPackets;
            } else {
                SetTTL(&packet, 64);
            }
            if (SendPacket(&packet, &tv, config->MainConfig.Delay))
                return 1;
            packetNum++;
        }
        fprintf(stderr, "%4d %8d %15.2lf\n", testNum, packetsPerTest, frenq*100);
    }
    FinishWriter();
    return 0;
}
BOOL CMulticastSocket::CreateSendingSocket(UINT nTTL, BOOL bLoopBack)
{
	if(!m_SendSocket.Create(0, SOCK_DGRAM, 0))		// Create an unconnected UDP socket
		return FALSE;

	if(!SetTTL(nTTL))								// Set Time to Live as specified by user
		AfxMessageBox("Warning! Error Setting TTL");

	SetLoopBack(bLoopBack);							// Enable/Disable Loopback

	return TRUE;
}
Exemple #5
0
bool UDPManager::ConnectMcast(const char* pMcast, USHORT usPort)
{
	// associate the source socket's address with the socket
	if (!Bind(usPort))
	{
		//		int error = setLastError();
		return false;
	}

	// set ttl to default
	if (!SetTTL(1))
	{
		//		int error = setLastError();
	}

	if (!Connect(pMcast, usPort))
	{
		//		int error = setLastError();
		return false;
	}

	// multicast connect successful
	return true;
}
Exemple #6
0
bool UDPManager::ConnectMcast(const InetAddr &_addr)
{
	// associate the source socket's address with the socket
	if (!Bind(ntohs(_addr.sin_port)))
	{
		//		int error = setLastError();
		return false;
	}

	// set ttl to default
	if (!SetTTL(1))
	{
		//		int error = setLastError();
	}

	if (!Connect(_addr))
	{
		//		int error = setLastError();
		return false;
	}

	// multicast connect successful
	return true;
}
void main()
{
	char *szDestIp = "10.16.115.178"; // 210.181.18.12910.16.115.25 61.55.66.30

	char recvBuf[1024] = { 0 };

	// 创建用于接收ICMP封包的原始套节字,绑定到本地端口
	SOCKET sRaw = ::socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
	sockaddr_in in;
	in.sin_family = AF_INET;
	in.sin_port = 0;
	in.sin_addr.S_un.S_addr = INADDR_ANY;
	if(::bind(sRaw, (sockaddr*)&in, sizeof(in)) == SOCKET_ERROR)
	{
		printf(" bind() failed \n");
		return;
	}

	SetTimeout(sRaw, 5*1000);

	// 创建用于发送UDP封包的套节字
	SOCKET sSend = ::socket(AF_INET, SOCK_DGRAM, 0);	
	
	SOCKADDR_IN destAddr;
	destAddr.sin_family = AF_INET;
	destAddr.sin_port = ::htons(22);
	destAddr.sin_addr.S_un.S_addr = ::inet_addr(szDestIp);


	int nTTL = 1;
	int nRet;
	ICMP_HDR *pICMPHdr;
	int nTick;	
	SOCKADDR_IN recvAddr;
	do
	{
		// 设置UDP封包的TTL值
		SetTTL(sSend, nTTL);
		nTick = ::GetTickCount();

		// 发送这个UDP封包
		nRet = ::sendto(sSend, "hello", 5, 0, (sockaddr*)&destAddr, sizeof(destAddr));
		if(nRet == SOCKET_ERROR)
		{
			printf(" sendto() failed \n");
			break;
		}


		// 等待接收路由器返回的ICMP报文
		int nLen = sizeof(recvAddr);
		nRet = ::recvfrom(sRaw, recvBuf, 1024, 0, (sockaddr*)&recvAddr, &nLen);
		if(nRet == SOCKET_ERROR)
		{
			if(::WSAGetLastError() == WSAETIMEDOUT)
			{
				printf(" time out \n");
				break;
			}
			else
			{
				printf(" recvfrom() failed \n");
				break;
			}
		}

		// 解析接收到的ICMP数据
		pICMPHdr = (ICMP_HDR*)&recvBuf[20]; // sizeof(IPHeader)

		if(pICMPHdr->icmp_type != 11 && pICMPHdr->icmp_type != 3 && pICMPHdr->icmp_code != 3)
		{
			printf(" Unexpected Type: %d , code: %d \n",
				pICMPHdr->icmp_type, pICMPHdr->icmp_code);
		}
		else
		{
			char *szIP = ::inet_ntoa(recvAddr.sin_addr);
			
			printf(" 第%d个路由器,IP地址:%s \n", nTTL, szIP);
			printf("      用时:%d毫秒 \n", ::GetTickCount() - nTick);
		}
		
		if(destAddr.sin_addr.S_un.S_addr == recvAddr.sin_addr.S_un.S_addr)
		{	
			printf("目标可达 \n");
			break;
		}

		printf("//------------------------------------// \n");

	}while(nTTL++ < 20);

	::closesocket(sRaw);
	::closesocket(sSend);
}
//   Create multicast socket for Sending Packets    //
bool CCiMulticastSocket::CreateBlockingSendSocket( const char *groupIP, unsigned short groupPort, const char *SourceInterfaceIP, unsigned int nTTL, bool bLoopBack )
{
	// Create socket for Sending packets from multicast group
	if( ( m_iSendSocket = socket(AF_INET, SOCK_DGRAM, 0))  == -1 ) {
		return false;
    }

	// Fill m_saHostGroup for sending datagrams When you use SendN()
	memset(&m_saHostGroup, 0, sizeof(m_saHostGroup));

	m_saHostGroup.sin_family = AF_INET;
	m_saHostGroup.sin_addr.s_addr = inet_addr(groupIP);
	m_saHostGroup.sin_port = htons(groupPort);

	// Fill m_saSourceAddress To bind sending socket( Requirement )
	memset(&m_saSourceAddress, 0, sizeof(m_saSourceAddress));

	m_saSourceAddress.sin_family = AF_INET;
	m_saSourceAddress.sin_addr.s_addr = htonl(INADDR_ANY);
	m_saSourceAddress.sin_port = htons(0);

	if ( bind( m_iSendSocket, (struct sockaddr *)&m_saSourceAddress, sizeof(m_saSourceAddress)) != 0) {
        return false;
    }

	// Make send socket reuseable immediately when it is closed.
	const int on = 1;
	if( setsockopt( m_iSendSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) == -1 ) {
        return false;
    }

	// Join the multicast group
	m_mrMReq.imr_multiaddr.s_addr = inet_addr(groupIP);	/* group addr */
	if ( strcmp("0.0.0.0", SourceInterfaceIP) == 0 ) {
		m_mrMReq.imr_interface.s_addr = htons(INADDR_ANY);		// use default
	} else {
		m_mrMReq.imr_interface.s_addr = inet_addr(SourceInterfaceIP);
	}// m_mrMReq.imr_interface.S_un.S_addr를 안 주게 되면 IP_ADD_MEMBERSHIP에서 ERROR가 난다.

	int resultOfsetsockopt;
	if( ( resultOfsetsockopt = setsockopt( m_iSendSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&m_mrMReq, sizeof(m_mrMReq) ) ) < 0 ) {
		return false;
	}

	// Local Interface Setting
	if ( strcmp("0.0.0.0", SourceInterfaceIP) == 0 ) {
		m_MyInterfaceAddress.s_addr = htons(INADDR_ANY);  // Use default interface
	}
	else {
		m_MyInterfaceAddress.s_addr = inet_addr(SourceInterfaceIP);
	}

	if( setsockopt( m_iSendSocket, IPPROTO_IP, IP_MULTICAST_IF, (char *)&m_MyInterfaceAddress, sizeof(m_MyInterfaceAddress)) < 0 ) {
		return false;
	}

	if ( !SetTTL(nTTL) ) {// Set Time to Live as specified by user
		return false;
	}

	SetLoopBack(bLoopBack);							// Enable/Disable Loopback

	return true;
}