//-------------------------------------------------------------------------------- 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; }
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; }
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; }
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; }