亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pingsimulator.cpp

?? 用rawsocket實現簡單的ping程序
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
			else  // 如果都不是以上選項,則認為是目的主機的IP地址或者主機名
			{
				destIP = inet_addr(argv[i]);
				if (destIP != INADDR_NONE)
				{
					hasDestHost = true;
					onlyOneDestHost = true;
					memset(destHostName, 0, sizeof (destHostName));
					continue;
				}
				else if (0 == strcmp(argv[i] + strlen(argv[i]) - 2, ".*"))
				{
					// 用數字1替換末尾的*號,并重新嘗試轉換
					char* str = new char[strlen(argv[i]) + 1];
					strcpy(str, argv[i]);
					str[strlen(str) - 1] = '1';
					// 再次嘗試進行轉換
					destIP = inet_addr(str);
					if (destIP != INADDR_NONE)
					{
						hasDestHost = true;
						onlyOneDestHost = false;
						memset(destHostName, 0, sizeof (destHostName));
						continue;
					}
				}

				// 如果上面的轉換都沒有成功,則認為用戶輸入的是目標主機的主機名
				hostent* pDestHost = gethostbyname(argv[i]);
				if (pDestHost != NULL && pDestHost->h_addr_list != NULL)
				{
					destIP = (*(in_addr*) pDestHost->h_addr_list[0]).S_un.S_addr;
					hasDestHost = true;
					onlyOneDestHost = true;
					strcpy(destHostName, argv[i]);
					continue;
				}
				else
				{
					cout << "\n錯誤:\n";
					cout << "    參數\"" << argv[i] << "\"不是有效的IP地址或者主機名.\n";
					return false;
				}
			}
		}  // for循環結束
		return true;
	}
}



// ********************************************************************************
// 顯示命令的使用方法
//		功	能:輸出程序的用法、選項、以及提示信息
//		參	數:無
//		返回值:void
// ********************************************************************************

void showUsage()
{
	// 輸出使用方法
	cout << "用法 :\n";
	cout << "    PingSimulator.exe [-t] [-a] [-n count] [-l size] [i TTL] [-v TOS]\n";
	cout << "                      [-w timeout] [-1] [-2] target_name\n";

	// 輸出選項的詳細介紹
	cout << "選項:\n";
	cout.setf(ios::left);
	cout << "    " << setw(16) << "-t" << "Ping 指定的主機,直到按[Ctrl-C]鍵強行終止.\n";
	cout << "    " << setw(16) << "-a" << "將目的主機的IP地址解析為主機名.\n";
	cout << "    " << setw(16) << "-n count" << "發送count個Ping請求報文.\n";
	cout << "    " << setw(16) << "-l size" << "設定發送緩沖區的大小為size字節.\n";
	cout << "    " << setw(16) << "-i TTL" << "設定生存時間為TTL指定的數值.\n";
	cout << "    " << setw(16) << "-v TOS" << "設定服務類型為TOS指定的數值.\n";
	cout << "    " << setw(16) << "-w timeout" << "設定每一個Ping響應報文的超時時間為timeout毫秒.\n";
	cout << "    " << setw(16) << "-1" << "僅對指定的一臺主機進行Ping操作.\n";
	cout << "    " << setw(16) << "-2" << "對指定的多臺主機進行Ping操作.\n\n";
	cout << "    " << setw(16) << "target_name" << "目的主機的IP地址或者主機名.\n";
	cout << "    " << setw(16) << "  " << "如果指定了參數\"-1\",則target_name表示唯一的目的主機.\n";
	cout << "    " << setw(16) << "  " << "如果指定了參數\"-2\",則target_name表示多個目的主機.\n";
	cout << "    " << setw(16) << "  " << "如果沒有指定這兩個參數,則根據target_name的形式自動進行判斷.\n";

	// 顯示提示
	cout << "提示:\n";
	cout << "    在Ping的過程當中,您可以使用 [Ctrl-C] 鍵終止對某一臺主機的Ping操作\n";
	cout << "    也可是使用 [Ctrl-Break] 鍵來終止對全部主機的Ping操作\n\n";

	// 暫停一下
	system("pause");
}



// *********************************************************************************
// 檢測參數是否存在沖突的情況
//		功	能:檢測是否有不能共存的參數,如果有,則輸出錯誤信息
//		參	數:無
//		返回值:如果參數不存在沖突,則返回true;否則返回false
// *********************************************************************************

bool checkParams()
{
	// 選項"-t"與"-n count"不能共存
	if (hasParam_t && hasParam_n_count)
	{
		cout << "\n錯誤:\n";
		cout << "    選項\"-t\"表示不停的Ping,而\"-n count\"指定Ping的次數,二者不能同時使用.\n";
		return false;
	}

	// 選項"-1"與"-2"不能共存
	if (hasParam_1 && hasParam_2)
	{
		cout << "\n錯誤:\n";
		cout << "    選項\"-1\"表示僅有一臺目標主機,選項\"-2\"表示有多臺目標主機,二者不能同時使用.\n";
		return false;
	}
	
	// 檢測是否已經獲得了目標主機的IP地址,如果沒有,則報錯
	if (!hasDestHost)
	{
		cout << "\n錯誤:\n";
		cout << "    必須指定目標主機的IP地址或者主機名.\n";
		return false;
	}

	// 檢測IP地址的類型與參數是否不匹配
	if (hasDestHost && onlyOneDestHost && hasParam_2)
	{
		cout << "\n錯誤:\n";
		cout << "    選項\"-2\"表示有多臺目標主機,與目的IP的類型不匹配.\n";
		return false;
	}

	// 檢測IP地址的類型與參數是否不匹配
	if (hasDestHost && !onlyOneDestHost && hasParam_1)
	{
		cout << "\n錯誤:\n";
		cout << "    選項\"-1\"表示僅有一臺目標主機,與目的IP的類型不匹配.\n";
		return false;
	}

	// 如果沒有發生以上沖突,則認為參數都是有效的
	return true;
}



// ************************************************************************************
// 設置socket選項
//		功	能:對創建的原始套接字的選項進行設定或更改
//		參	數:無
//		返回值:void
// ************************************************************************************

void setSocketOptions()
{
	// 設置發送緩沖區的大小
	setsockopt(rawSocket, SOL_SOCKET, SO_SNDBUF, (char*) &sendBufferSize, sizeof (sendBufferSize));

	// 設置ttl
	setsockopt(rawSocket, IPPROTO_IP, IP_TTL, (char*) &ttl, sizeof (ttl));

	// 設置tos
	setsockopt(rawSocket, IPPROTO_IP, IP_TOS, (char*) tos, sizeof (tos));

	// 設置超時時間
	setsockopt(rawSocket, SOL_SOCKET, SO_SNDTIMEO, (char*) &timeout, sizeof (timeout));
	setsockopt(rawSocket, SOL_SOCKET, SO_RCVTIMEO, (char*) &timeout, sizeof (timeout));
}



// ***********************************************************************************
// 對目標主機進行Ping操作
//		功	能:對一臺或多臺目標主機進行Ping操作
//		參	數:無
//		返回值:void
// ***********************************************************************************

void ping()
{
	// 獲取目標主機的數目
	numberOfHostsToPing = (onlyOneDestHost ? 1 : 255);

	// 循環處理每一個目標主機
	while (numberOfHostsToPing > 0)
	{
		// 重置要發送的Ping請求報文的數目
		pingRequestsToSend = totalPingRequests;

		// 初始化統計信息
		StatisticsRecord statisticsRecord;
		memset(&statisticsRecord, 0, sizeof (statisticsRecord));
		statisticsRecord.maxTime = -1;  // 負數表示無效值,即沒有目前還沒有收到Ping響應報文
		statisticsRecord.minTime = -1;  // 負數表示無效值,即沒有目前還沒有收到Ping響應報文

		// 顯示目標主機的主機名或者IP地址等信息
		showDestHostInfo();

		// 填充目標主機的socket地址
		sockaddr_in destSocketAddress;
		memset(&destSocketAddress, 0, sizeof (destSocketAddress));
		destSocketAddress.sin_family = AF_INET;
		destSocketAddress.sin_addr.S_un.S_addr = destIP;

		// Ping當前的目標主機
		while (pingRequestsToSend > 0)  // 當指定數目的Ping請求未發送完時,繼續進行Ping操作
		{
			// 構造Ping請求報文
			char icmpSendBuffer[sizeof (ICMPHeader) + DEFAULT_ICMP_DATA_SIZE];
			fillIcmpPacket(icmpSendBuffer, sizeof (ICMPHeader) + DEFAULT_ICMP_DATA_SIZE);

			// 記錄當前時間以及報文的序號
			PingRecord pingRecord;
			pingRecord.ipToPing = destIP;
			pingRecord.id = htons((unsigned short) GetCurrentProcessId());
			pingRecord.sequenceNumber = htons(sequenceNumber++);
			pingRecord.roundTripTime = GetTickCount();

			// 發送Ping請求報文
			if (SOCKET_ERROR == sendto(rawSocket, icmpSendBuffer, sizeof (icmpSendBuffer), 0, (sockaddr*) &destSocketAddress, sizeof (destSocketAddress)))
			{
				cout << "發送Ping請求報文失敗.\n";
				return;
			}
			else  // 發送成功,將已發送的Ping請求報文數目加1
			{
				statisticsRecord.totalRequests++;
			}
			
			// 準備接收Ping響應報文
			sockaddr_in from;  // 發送響應報文的socket地址
			int fromLength = sizeof (from);  // socket地址的長度
			int recvDataLength = 0;  // 接收到的數據的長度
			char recvIcmpBuffer[MAX_ICMP_PACKET_SIZE];  // 接收緩沖區

			// 循環接收Ping響應報文,直到獲得所需的Ping響應,或者超時
			while (true)
			{
				recvDataLength = recvfrom(rawSocket, recvIcmpBuffer, MAX_ICMP_PACKET_SIZE, 0, (sockaddr*) &from, & fromLength);
				if (recvDataLength != SOCKET_ERROR)  // 接收到數據
				{
					// 對接收到的數據報進行解析,如果是正確的Ping響應報文則顯示之,并更新統計信息
					if (parseReceivedPacket(recvIcmpBuffer, pingRecord))
					{
						showReply(pingRecord);  // 顯示響應信息
						setStatisticsRecord(statisticsRecord, pingRecord);  // 更新統計信息
						Sleep(1000);  // 暫停1秒后,發送下一個Ping請求
						break;
					}
					else  // 如果接收到了錯誤的包,則重新接收
					{
						continue;
					}
				}
				else if (WSAETIMEDOUT == WSAGetLastError())  // 如果超時,則輸出超時信息,并發送下一個Ping請求
				{
					cout << "Request timed out.\n";
					break;
				}
				else  // 接收出錯
				{
					cout << "接收Ping響應報文時發生錯誤.\n";
					return;
				}
			}

			// 如果沒有啟用"-t"選項,則將需要發送的Ping請求報文的數目減1
			if (!hasParam_t)
			{
				pingRequestsToSend--;
			}
		}

		// 輸出統計信息
		showStatisticsInfo(statisticsRecord);

		// 將未處理的目標主機的數目減1
		numberOfHostsToPing--;

		// 將目標主機設為當前所Ping主機的下一臺
		destIP = (htonl)((ntohl)(destIP) + 1);
	}
}



// ***********************************************************************************
// 填充ICMP報文
//		功	能:填充ICMP報文的各個字段
//		參	數:1. pIcmpPacket : 發送緩沖區,用來存放待發送的Ping請求報文
//				2. size : 發送緩沖區的大小
//		返回值:void
// ***********************************************************************************

void fillIcmpPacket(char* pIcmpPacket, int size)
{
	ICMPHeader* pIcmpHeader = (ICMPHeader*) pIcmpPacket;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩三级视频在线观看| 欧美大黄免费观看| 国产一区二区免费看| 日日摸夜夜添夜夜添精品视频| 玉足女爽爽91| 亚洲一区二区三区视频在线播放| 成人欧美一区二区三区黑人麻豆| 国产精品久久久久一区| 中文字幕在线观看不卡| 亚洲黄色尤物视频| 亚洲成av人片一区二区梦乃 | 日韩精品电影在线观看| 午夜不卡在线视频| 久久精品国产**网站演员| 麻豆成人综合网| 国产一区二区电影| 成人爱爱电影网址| 99国产精品久久久久久久久久久| 色综合久久久网| 91精品国产综合久久久久久| 日本成人在线电影网| 麻豆91在线播放免费| 蜜桃一区二区三区四区| 韩国成人福利片在线播放| 国产精品一区在线观看乱码| 99久久99久久精品免费看蜜桃| 国产不卡免费视频| 色婷婷亚洲精品| 欧美日韩高清在线| 久久精品一区二区| 亚洲精品国产视频| 美腿丝袜亚洲综合| 99久久国产综合精品女不卡| 欧美性猛交xxxxxx富婆| 日韩欧美国产综合| 中文字幕亚洲综合久久菠萝蜜| 亚洲最色的网站| 国产一区二区三区香蕉| 欧美在线观看视频一区二区| 精品国产免费一区二区三区四区 | 中文字幕不卡一区| 亚洲一区二区免费视频| 国产一区二区三区国产| 欧美日韩免费高清一区色橹橹| 久久综合色婷婷| 午夜国产不卡在线观看视频| 波多野洁衣一区| 日韩久久久久久| 亚洲国产成人91porn| 成人激情免费视频| 久久婷婷成人综合色| 舔着乳尖日韩一区| 色婷婷国产精品| 国产精品久久久久影院亚瑟| 麻豆成人综合网| 91精品久久久久久久99蜜桃| 亚洲精品一二三四区| 国产丶欧美丶日本不卡视频| 7777精品伊人久久久大香线蕉| 亚洲激情图片一区| 99精品视频在线免费观看| 久久综合九色欧美综合狠狠| 青青草国产精品亚洲专区无| 欧美色大人视频| 亚洲精品一卡二卡| 一本大道综合伊人精品热热| 国产欧美一区二区三区网站 | 欧美日韩精品一二三区| 中文字幕永久在线不卡| 国产一区二区三区视频在线播放| 欧美午夜寂寞影院| 国产精品乱人伦| 国内不卡的二区三区中文字幕| 91成人网在线| 综合久久久久久久| 丁香婷婷深情五月亚洲| 欧美电视剧免费观看| 日韩成人伦理电影在线观看| 91丝袜美腿高跟国产极品老师| xnxx国产精品| 国产一区二区网址| 精品免费日韩av| 精品亚洲成av人在线观看| 欧美不卡一区二区三区| 国产真实乱偷精品视频免| 2023国产精品视频| 亚洲综合一区二区| 91超碰这里只有精品国产| 亚洲主播在线播放| 欧美一区二区三区在线观看视频| 日韩经典一区二区| 2017欧美狠狠色| 从欧美一区二区三区| 亚洲精品成人天堂一二三| 欧美揉bbbbb揉bbbbb| 日av在线不卡| 久久先锋资源网| 99久久99久久综合| 亚洲第一二三四区| 精品国产91乱码一区二区三区| 国内精品国产三级国产a久久| 国产精品久久久久久一区二区三区| 99综合影院在线| 午夜视频一区在线观看| 久久久久久夜精品精品免费| 不卡免费追剧大全电视剧网站| 亚洲一区日韩精品中文字幕| 欧美一区二区三区喷汁尤物| 成人做爰69片免费看网站| 亚洲愉拍自拍另类高清精品| 亚洲精品一区二区三区影院| 97久久精品人人做人人爽50路 | 日本不卡在线视频| 久久先锋影音av鲁色资源网| 91免费在线看| 精品一区二区三区免费| 国产日韩三级在线| 日韩一区二区三区电影在线观看| 国产91精品入口| 日韩电影在线免费| 欧美极品美女视频| 欧美日韩黄视频| 国产福利一区二区三区视频| 亚洲人成伊人成综合网小说| 在线成人午夜影院| 日韩极品在线观看| 国产精品天干天干在观线| 欧美日韩亚洲丝袜制服| 国产成人精品亚洲日本在线桃色| 亚洲在线成人精品| 久久久777精品电影网影网| 欧美精品99久久久**| 色综合久久综合中文综合网| 丁香亚洲综合激情啪啪综合| 捆绑变态av一区二区三区| 亚洲国产视频网站| 亚洲美女视频在线观看| 国产精品麻豆99久久久久久| 国产天堂亚洲国产碰碰| 91精品欧美综合在线观看最新| 在线观看av不卡| 91麻豆高清视频| 波多野结衣在线aⅴ中文字幕不卡| 久久99精品国产| 另类小说综合欧美亚洲| 美女尤物国产一区| 免费高清成人在线| 亚洲成人精品影院| 亚洲国产一区二区在线播放| 亚洲免费观看在线视频| **欧美大码日韩| 综合av第一页| 最新国产の精品合集bt伙计| 中文字幕av一区二区三区免费看| 久久精品视频在线看| 日本一区二区三区在线观看| 国产午夜精品久久久久久免费视| 久久综合色婷婷| 国产日韩欧美在线一区| 国产精品天天摸av网| 亚洲欧洲综合另类在线| 亚洲午夜三级在线| 日韩专区欧美专区| 久久精品99久久久| 粉嫩aⅴ一区二区三区四区五区| 成人国产一区二区三区精品| 99久久国产综合色|国产精品| 色综合久久久久久久久| 欧美日韩精品一区视频| 日韩一级黄色片| 国产亚洲一区二区三区| 国产精品美女视频| 亚洲一区在线看| 麻豆成人免费电影| 成人手机电影网| 欧美中文字幕亚洲一区二区va在线| 欧美精品日韩一本| 久久免费看少妇高潮| 亚洲欧洲国产日韩| 图片区小说区国产精品视频| 久久99精品国产.久久久久久| 成人高清视频在线| 精品视频在线免费看| 久久久久久久久97黄色工厂| 亚洲欧美日韩国产中文在线| 奇米在线7777在线精品| 99精品视频一区二区| 日韩一级免费观看| 亚洲猫色日本管| 精品伊人久久久久7777人| 不卡视频在线看| 欧美一区二区高清| 国产精品福利一区二区三区| 日韩av一区二区三区四区| a亚洲天堂av| 精品国产一区二区三区四区四| 亚洲精品一二三四区| 国产一区二区在线影院| 欧美日韩国产不卡| 亚洲欧美激情小说另类|