永发信息网

菜鸟问题。。。。求指导 需在VC下运行

答案:2  悬赏:10  手机版
解决时间 2021-12-29 10:54
”发现网络中的活动主机“的代码。大神求指导。。。。可以正确运行出来的代码
最佳答案
// scanhost.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "scanhost_head.h"

WSADATA wsaData;
SOCKET sockRaw;
struct sockaddr_in dest, from, end;

int fromlen = sizeof(from);
char * recvbuf = new char[MAX_PING_PACKET_SIZE];
unsigned int addr = 0;
long ThreadNumCounter= 0,ThreadNumLimit = 20;
long * aa = &ThreadNumCounter;

_TCHAR* argv[] =
{
"scanhost\0",
"169.254.100.1\0",
"169.254.196.255\0"
};

int _tmain()
{
// init network
if( WSAStartup(MAKEWORd(2,1), &wsaData) != 0 )
{
FatalError("WSAStartup failed! \n");
ExitProcess(STATUS_FAILED);
}

//create socket
sockRaw = WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);
if( sockRaw == INVALID_SOCKET )
{
FatalError(" WSASocket() failed: \n");
ExitProcess(STATUS_FAILED);
}

// set
int timeout = 1000;
int bread = setsockopt( sockRaw, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));
if( SOCKET_ERROR == bread )
{
FatalError(" failed to setsockopt: set option error!\n");
int error = WSAGetLastError();
ExitProcess(STATUS_FAILED);
}

timeout = 1000;
bread = setsockopt(sockRaw, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));
if( SOCKET_ERROR == bread )
{
FatalError("failed to set send timeout!\n");
ExitProcess(STATUS_FAILED);
}

memset(&dest, 0,sizeof(dest) );

unsigned long startIP, endIP;
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = inet_addr(argv[1]); //填入开始搜索IP地址
startIP = inet_addr(argv[1]);

end.sin_family = AF_INET;
end.sin_addr.s_addr = inet_addr(argv[2]);
endIP = inet_addr(argv[2]);

HANDLE hThread;
// while( htonl( startIP) < htonl(endIP) )
while( startIP < endIP ) {
if( ThreadNumCounter > ThreadNumLimit )
{
Sleep(5000);
continue;
}
DWORD ThreadID;
sockaddr_in * pIPAddrTemp = new( sockaddr_in );
if( !pIPAddrTemp )
{
FatalError( "memory alloc failed!\n");
return -1;
}

*pIPAddrTemp = dest;

//create new thread
clock_t start;
start = clock();
hThread = CreateThread(NULL,NULL,&FindIP, (LPVOID)pIPAddrTemp, NULL, &ThreadID);

long i=60000000L;
while( i--);
TerminateThread( hThread, 0);
InterlockedDecrement( aa );
memset( &from, 0, sizeof(from) );
startIP = htonl(htonl( startIP + 1 ) ); // get next ip address
dest.sin_addr.s_addr = startIP;
}
while( ThreadNumCounter != 0 )
{
Sleep(2000);
return -2;
}
return 0;
}

DWORD WINAPI FindIP( LPVOID pIPAddrTemp )
{
int error = 0;
InterlockedIncrement( aa );

char icmp_data[MAX_PACKET];
memset(icmp_data, 0, MAX_PACKET);

int datasize = DEF_PACKET_SIZE;
datasize += sizeof(IcmpHeader);
fill_icmp_data( icmp_data, datasize );
((IcmpHeader *) icmp_data) ->checksum = 0;
((IcmpHeader *) icmp_data) ->seq = 0;

((IcmpHeader *) icmp_data) ->checksum = checksum( (USHORT*) icmp_data, datasize);

int bwrote = sendto( sockRaw, icmp_data, datasize, 0, (struct sockaddr* )pIPAddrTemp, sizeof(dest));
int n=0;
if( SOCKET_ERROR == bwrote )
{
if( bwrote == SOCKET_ERROR )
{
FatalError( "time out!\n");
error = WSAGetLastError();
}
FatalError( " sendto failed! \n");
ExitProcess(STATUS_FAILED);
n = 1;
}
if ( bwrote < datasize )
{
FatalError( "write some bytes!\n" );
ExitProcess(STATUS_FAILED);
n = 1;
}

// accept data packet
int bread = recvfrom( sockRaw, recvbuf, MAX_PING_PACKET_SIZE, 0, (struct sockaddr*)&from, &fromlen);
if ( bread == SOCKET_ERROR )
{
if ( WSAGetLastError( ) == WSAETIMEDOUT )
{
FatalError("time out!\n");
}
FatalError( " recvfrom failed!\n");
ExitProcess( STATUS_FAILED);
n = 1;
}

if( n==0 )
decode_resp( recvbuf, bread, &from);
InterlockedDecrement(aa); //线程数目-1

return 0;
}

USHORT checksum( USHORT * buffer, int size )
{
unsigned long cksum = 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);
}

void fill_icmp_data( char * icmp_data, int datasize)
{
IcmpHeader *icmp_hdr;
char * datapart;
icmp_hdr = (IcmpHeader*) icmp_data;
icmp_hdr ->type = ICMP_ECHO;
icmp_hdr ->id = (USHORT)GetCurrentThreadId();
datapart = icmp_data + sizeof(IcmpHeader);
memset(datapart, 'A', datasize - sizeof(IcmpHeader));

}

void decode_resp( char *buf, int bytes, struct sockaddr_in * from)
{
IpHeader* iphdr;
IcmpHeader* icmphdr;
unsigned short iphdrlen;
iphdr = (IpHeader *)buf;
iphdrlen = iphdr ->headlen * 4;
icmphdr = (IcmpHeader * ) (buf + iphdrlen);

// if the packet is to short , then throw it
if( bytes < iphdrlen + ICMP_MIN )
{
FatalError("数据包太短");
return;
}

if ( icmphdr ->type != ICMP_ECHO_REPLY ) {
FatalError("不是回送响应!\n");
return;
};

if( icmphdr ->id != (USHORT)GetCurrentThreadId()) {
FatalError("ID号不相符,丢弃!\n");
return;
};

cout<< "活动主机:" <sin_addr) <
}
全部回答
http://topic.csdn.net/t/20020717/11/880375.html 看看这个帖子对你有帮助没
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
在数轴上距离原点5个单位长度的点所表示的数
学钢琴好,还是学古筝好?
怎么给电脑一次设置每天的定时关机
世界上最著名的国际性河流是欧洲的________.
种小葱,几天能发芽
单选题Wearesupposed______thelostchildat
宜兴紫砂壶哪里有的卖?
眼镜蛇电子狗要充值吗
在某地区,数百万亩的树木受吉普赛蛾幼虫大规
耒阳市衡阳健康药房(体育北路)地址是什么,有
超市里的洗发水哪些牌子是弱酸性的? 5分
单选题下列词语中没有错别字的一组是A.详和
溢满的反义词是什么
卧薪尝胆一词中,薪指什么,卧薪指什么,尝胆
Today is my little sister’s birthday. My
推荐资讯
什么软件调色好看
富隆五金饰扣我想知道这个在什么地方
户口本一般有什么用途
梦见自己掉沟里
洗澡前洗脸好、还是洗完澡再洗脸好?大神们帮
农村商业银行电话银行密码怎么申请
根据所给提示,请用化学符号填空:(1)氩气_
送哥哥生日礼物送什么有创意?
根据对外购固定资产所含税金扣除方式的不同,
推荐一些异能类的电影电视剧,最好男女主不要
神武盘丝怎么这垃圾
某次数学竞赛原定一等奖8人,二等奖16人.现在
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?