多線程使用不同原始socket發(fā)送ICMP的問題_第1頁
多線程使用不同原始socket發(fā)送ICMP的問題_第2頁
多線程使用不同原始socket發(fā)送ICMP的問題_第3頁
多線程使用不同原始socket發(fā)送ICMP的問題_第4頁
多線程使用不同原始socket發(fā)送ICMP的問題_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

多線程使用不同原始 socket發(fā)送ICMP的問題ICMP報文沒有端口,在進(jìn)程中或者多線程中同時新建多個原始套接字,然后發(fā)送ICMP包,然后等待返回結(jié)果,此時這些原始socket并不能分清哪個ICMP響應(yīng)包是屬于自己的(因為沒有端口,到達(dá)的socket的目的IP都是一樣的)。解決方法可以從ICMP里面的sequencenumber下手,~一個ping和一個pingreply的seqno是一樣的,而且唯一下面發(fā)出自己的程序,麻煩高手看看,問題如何解決?自己寫的CIcmpsocket類簡介:1)通過構(gòu)造函數(shù)得到目的 IP,和接收icmp的超時時間,和持續(xù)發(fā)送的時長;2)通過調(diào)用成員函數(shù) start來開始發(fā)包 icmp探測的線程,也就是說一個類有自己的一個線程;3)創(chuàng)建3個CIcmpsocket類的對象,賦予不同的目的 IP,然后調(diào)用它們的 start函數(shù),使其開始進(jìn)行各自的 icmp探測;結(jié)果出現(xiàn)3個線程互相收到不是自己的 icmp回復(fù)報文。麻煩高手解答 ULONGWINAPIIcmpSocketThreadProc(LPVOIDlpParameter){CIcmpSocket*pThread;pThread=(CIcmpSocket*)lpParameter;pThread->Execute();ExitThread(0);return1;}CIcmpSocket::CIcmpSocket(DWORDulDstIP,DWORDulDataSize,DWORDulRcvTimeO,DWORDulTestTime){m_Socket=INVALID_SOCKET;intiTimeout=2000;/*2S 超時*/DWORDulLoop=0;structsockaddrstAddr={0};m_ThreadHandle=NULL;m_tTestTime=ulTestTime;m_ulTimeOut=ulRcvTimeO;m_ulThreadId=0;InitializeCriticalSection(&m_Section);memset(&m_IPHdr,0,sizeof(IpHeader));memset(&m_IcmpHeader,0,sizeof(IcmpHeader));memset(&m_Dest,0,sizeof(m_Dest));if(INADDR_NONE==ulDstIP){assert(0);}m_Dest.sin_family=AF_INET;m_ulDatasize=ulDataSize;m_ulDatasize+=sizeof(IcmpHeader);m_pSndData=(char*)malloc(m_ulDatasize);if(NULL==m_pSndData){assert(0);}m_pRcvData=(char*)malloc(MAX_DATASIZE);if(NULL==m_pRcvData){assert(0);}//fill_icmp_data(m_pSndData,m_ulDatasize);m_bTerminate=false;}CIcmpSocket::~CIcmpSocket(){if(m_Socket!=INVALID_SOCKET){closesocket(m_Socket);m_Socket=INVALID_SOCKET;}Lock();DWORDulDelayCnt=m_DelayMsArray.GetSize();DelayMsInfo*pstDelay=NULL;for(DWORDulLoop=0;ulLoop<ulDelayCnt;ulLoop++){pstDelay=(DelayMsInfo*)m_DelayMsArray[ulLoop];if(NULL!=pstDelay){free((void*)pstDelay);}}m_DelayMsArray.RemoveAll();UnLock(); if(m_pSndData){free(m_pSndData);}if(m_pRcvData){free(m_pRcvData);}}voidCIcmpSocket::Execute(){intiTimeout=0; m_ulThreadId=GetCurrentThreadId();if(WSAStartup(MAKEWORD(2,2),&m_wsaData)!=0){assert(0);}m_Socket=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);if(INVALID_SOCKET==m_Socket){assert(0);}iTimeout=(int)m_ulTimeOut;if(SOCKET_ERROR==setsockopt(m_Socket,SOL_SOCKET,SO_RCVTIMEO,(char*)&iTimeout,sizeof(iTimeout))){assert(0);}iTimeout=1000;if(SOCKET_ERROR==setsockopt(m_Socket,SOL_SOCKET,SO_SNDTIMEO,(char*)&iTimeout,sizeof(iTimeout))){assert(0);}while(!m_bTerminate){Run(); Sleep(10);}ExitThread(0);return;}voidCIcmpSocket::fill_icmp_data(char*icmp_data,intdatasize){IcmpHeader*icmp_hdr=NULL;char*datapart=NULL;icmp_hdr=(IcmpHeader*)icmp_data;icmp_hdr->i_type=ICMP_ECHO;// 類型為ICMP_ECHOicmp_hdr->i_code=0;icmp_hdr->i_id=(USHORT)m_ulThreadId;// 識別號為進(jìn)程號icmp_hdr->i_cksum=0;// 校驗和初始化icmp_hdr->i_seq=0;//序列號初始化datapart=icmp_data+sizeof(IcmpHeader);//數(shù)據(jù)端的地址為icmp報文地址加上 ICMP的首部長度memset(datapart,'A',datasize-sizeof(IcmpHeader));//這里我填充的數(shù)據(jù)全部為"A",你可以填充任何代碼和數(shù)據(jù),實際上木馬和控制端之間就是通過數(shù)據(jù)段傳遞數(shù)據(jù)的。return;}//CheckSum函數(shù)是標(biāo)準(zhǔn)的校驗和函數(shù)USHORTCIcmpSocket::CheckSum(USHORT*buffer,intsize){unsignedlongcksum=0;{

while(size>1)cksum+=*buffer++;size-=sizeof(USHORT);}if(size){cksum+=*(UCHAR*)buffer;}cksum=(cksum>>16)+(cksum&0xffff);cksum+=(cksum>>16);return(USHORT)(~cksum);}voidCIcmpSocket::Lock(void){EnterCriticalSection(&m_Section);return;}voidCIcmpSocket::UnLock(void){LeaveCriticalSection(&m_Section);return;}voidCIcmpSocket::Start(){if(NULL==m_ThreadHandle){m_ThreadHandle=CreateThread(NULL,1000000,IcmpSocketThreadProc,(LPVOID)this,0,NULL);}return;}voidCIcmpSocket::Stop(){m_bTerminate=false;}boolCIcmpSocket::Run(){time_ttStart=time(NULL);time_ttNow=tStart;unsignedshortusSeq=0;DWORDulByteSndCnt=0;DWORDulByteRcvCnt=0;structsockaddrstIPSrc={0};intlSrcLen=sizeof(stIPSrc);DWORDulMsStart =0;DWORDulLastError=0;DWORDulLoop=0; while((tNow-tStart)<=m_tTestTime){IcmpHeader*pstIcmpHdr=(IcmpHeader*)m_pSndData;if((GetTickCount()-ulMsStart)<=2000){Sleep(10);continue;}fill_icmp_data(m_pSndData,m_ulDatasize);pstIcmpHdr->i_cksum=0;pstIcmpHdr->timestamp=GetTickCount();pstIcmpHdr->i_seq=usSeq;pstIcmpHdr->i_cksum=CheckSum((unsignedshort*)m_pSndData,m_ulDatasize);ulMsStart=GetTickCount();ulByteSndCnt=sendto(m_Socket,m_pSndData,m_ulDatasize,0,(structsockaddr*)&m_Dest,sizeof(structsockaddr));if(SOCKET_ERROR==ulByteSndCnt){ulLastError=WSAGetLastError();if(WSAETIMEDOUT==ulLastError){Lock();m_TimeOutArray.Add(tNow);UnLock();continue;}returnfalse;}if(ulByteSndCnt<m_ulDatasize){continue;}memset((void*)m_pRcvData,0,MAX_DATASIZE);ulByteRcvCnt=recvfrom(m_Socket,m_pRcvData,MAX_DATASIZE,0,(structsockaddr*)&stIPSrc,&lSrcLen);if(SOCKET_ERROR==ulByteRcvCnt){ulLastError=WSAGetLastError();if(WSAETIMEDOUT==ulLastError){Lock();m_TimeOutArray.Add(tNow);UnLock();}}else{pstIcmpHdr=(structicmp*)(m_pRcvData+sizeof(IpHeader));if((ICMP_ECHOREPLY==pstIcmpHdr->i_code)&&(pstIcmpHdr->i_id==(USHORT)m_ulThreadId)){DelayMsInfo*pDelay=(DelayMsInfo*)malloc(sizeof(DelayMsInfo));pDelay->tTime=tNow;pDelay->ulDelay=(GetTickCount()-ulMsStart)+1;Lock();m_DelayMsArray.Add(pDelay);UnLock();}else{assert(0);}}usSeq++;tNow=time(NULL);Sleep(10);}returntrue;}boolCIcmpSocket::GetStatistic(CDWordArray&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論