18,356
社区成员
发帖
与我相关
我的任务
分享
DWORD WINAPI CIcmpPingDlg::ScanFunc(LPVOID lpParameter)
{
Icmp_Header *m_SendIcmp;
Icmp_Header *icmp;
IpHeader *m_ip;
BYTE IPField[4];
CString str="";
char IPbuf[100]={0};
HWND hwnd=((Pram*)lpParameter)->hwnd;
strcpy(IPbuf,((Pram*)lpParameter)->buf);
str=IPbuf;
//AfxMessageBox(str);
CString temp="";
int index=0;
int len=str.GetLength();
index=str.ReverseFind('.');
temp=str.Right(len-index-1);
IPField[3]=atoi(temp);
CString strDesAddr=str.Left(index+1);
CString cs=strDesAddr;
//AfxMessageBox(strDesAddr);
//=================================================================
while(IPField[3]<255)
{
temp="";
temp.Format("%d",IPField[3]);
strDesAddr=cs+temp;
//AfxMessageBox(strDesAddr);
SOCKET scan_sock=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
if(INVALID_SOCKET == scan_sock)
{
return 0;
}
int Timeout = 1000;
int Result = setsockopt(scan_sock, SOL_SOCKET, SO_RCVTIMEO, (char*) &Timeout, sizeof(Timeout));
if (Result == SOCKET_ERROR)
{
return 0;
}
char *DestIpAddr=strDesAddr.GetBuffer(strDesAddr.GetLength());
char IcmpBuffer[32]={0};
char buf[100]={0};
sockaddr_in DestAddr;
DestAddr.sin_addr.s_addr = inet_addr(DestIpAddr);
DestAddr.sin_port = htons(0);
DestAddr.sin_family = AF_INET;
m_SendIcmp = (Icmp_Header*)IcmpBuffer;
m_SendIcmp->Type = 8;
m_SendIcmp->Code = 0;
m_SendIcmp->ID = (USHORT)GetCurrentProcessId();
m_SendIcmp->Sequence = htons(1);
m_SendIcmp->Checksum = 0;
m_SendIcmp->Checksum = checksum((USHORT*)IcmpBuffer, sizeof(IcmpBuffer));
sprintf(buf,"ping %s ...\n",inet_ntoa(DestAddr.sin_addr));
CString strsend=buf;
Result = sendto(scan_sock, IcmpBuffer, sizeof(IcmpBuffer), 0, (SOCKADDR*) &DestAddr, sizeof(DestAddr));
if (Result == SOCKET_ERROR)
{
return 0;
}
//==========================================================================================
CString strrecv="";
memset(buf,0,100);
char RecvBuffer[1024]={0};
sockaddr_in addr;
int Len = sizeof(addr);
Result = recvfrom(scan_sock, RecvBuffer, 1024, 0, (sockaddr*) &addr, &Len);
if (Result == SOCKET_ERROR)
{
if (WSAGetLastError() != WSAETIMEDOUT)
{
return 0;
}
else
{
sprintf(buf,"Host %s is down.\n", DestIpAddr);
strrecv=buf;
}
}
if (Result < sizeof(Ip_Header) + sizeof(Icmp_Header))
{
sprintf(buf,"data error from %d\n", inet_ntoa(addr.sin_addr));
strrecv=buf;
}
m_ip = (Ip_Header*)RecvBuffer;
if ((m_ip->SourceAddr == DestAddr.sin_addr.s_addr) && (m_ip->Protocol == IPPROTO_ICMP))
{
icmp = (Icmp_Header*)(RecvBuffer + sizeof(Ip_Header));
if (icmp->Type != 0)
{
sprintf(buf,"type error %d ", icmp->Type);
strrecv=buf;
return 0;
}
if (icmp->ID != GetCurrentProcessId())
{
sprintf(buf,"id error %d\n", icmp->ID);
strrecv=buf;
return 0;
}
else if ((icmp->Type == 0) && (icmp->ID == GetCurrentProcessId()))
{
sprintf(buf,"Host %s is up.\n", DestIpAddr);
strrecv=buf;
}
}
str=strsend+" ";
str+=strrecv; //结果
if (closesocket(scan_sock) == SOCKET_ERROR)
{
sprintf(buf,"closesocket failed with error %d\n", WSAGetLastError());
return 0;
}
char *tmp=str.GetBuffer(str.GetLength());
char sendbuf[100]={0};
strcpy(sendbuf,tmp);
::SendMessage(hwnd,UM_ADDLIST,0,(LPARAM )sendbuf);
IPField[3]++;
}
return 1;
}