資源簡介
利用RawSocket實現簡單的Ping程序 ICMP協議
編程語言 C++
操作系統 Linux(Ubuntu 10.0)
開發環境(可選)Qt4.7.0

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?“ping.h“
#include?
#include?
#include?
#include?
#include?
#include?
#define?MAX_SEND_TIME?4
void?ping(char?*ip);
void?sigint(int?sig);
void?(*signal_set(int?signo?void?(*func)(int)))(int);
void?signal_init();
char?ip[100];
//unsigned?long?ip[100];
int?main(int?argc?char?*argv[])
{
????????//參數檢查
????????if(argc?!=?3)
????????{
????????????????printf(“Usage:?./rawSock?-n(1?or?2)?IP?\n“);
????????????????exit(1);
????????}
????????//ping單一地址
????????if?(strcmp(argv[1]“-1“)==?0)
????????{
???????????qDebug()<<“argv[2]“< ???????????unsigned?char*p;
???????????p?=?(unsigned?char*)argv[2];
???????/*??sprintf(ip?“%d.%d.%d.%d“?p[0]?p[1]?p[2]?p[3]);
???????????qDebug()<<“p[3]“<???????????qDebug()<<“ip“< */
????????????memcpy(ip?argv[2]?sizeof(argv[2]));
????????????int?i_ip?=?atoi(ip);
????????????qDebug()<<“i_ip“< ????????????ping(argv[2]);
????????????return?0;
????????}
????????//遍歷子網內所有地址
????????if(strcmp(argv[1]?“-2“)?==?0)
????????{
????????????char?*?last;
????????????int?i;
????????????char?ping_ip[20];
????????????int?len;
????????????//字符串處理?通過拼接字符串顯示所有遍歷的地址
????????????last?=?strrchr(?argv[2]?‘.‘);
????????????len?=?last?-?argv[2];
????????????argv[2][len]?=?‘\0‘;
????????????for(i?=?1?;?i?255?;?i?++)
????????????{
????????????????sprintf(ping_ip?“%s%c%d“?argv[2]?‘.‘?i);
????????????????ping(ping_ip);
????????????}
????????????return?0;
????????}
}
void?ping(char?*ip)
{
????????int?sockfd;
????????struct?sockaddr_in?dstaddr;
????????int?times?=?0;
????????if((sockfd?=?socket(AF_INET?SOCK_RAW?IPPROTO_ICMP))?==?-1)
????????{
????????????????printf(“Create?Socket?Fail!\n“);
????????????????exit(1);
????????}
????????//填補目的地址
????????dstaddr.sin_family?=?AF_INET;
????????dstaddr.sin_port?=?htons(0);
????????if(inet_pton(AF_INET?ip?&dstaddr.sin_addr)?==?-1)
????????{
????????????????printf(“Get?IP?%s?Error!\n“?ip);
????????????????exit(1);
????????}
????????//設置信號
????????signal_init();
????????//輸出ping信息
????????printInfo(ip);
????????//?循環發送ICMP包?回顯
????????while(times?????????{
????????????????sendPing(sockfd?&dstaddr);
????????????????recvPing(sockfd?&dstaddr);
????????????????times++;
?????????????//???print_stat(ip);
????????}
????????qDebug()<<“ssssssss“;
????????//輸出統計信息
????????printState(ip);
}
/*?SIGINT信號處理函數?發送消息*/
void?sigint(int?sig)
{
????????printState(ip);
????????exit(0);
}
/*?進程信號設置函數?*/
void?(*signal_set(int?signo?void?(*func)(int)))(int)
{
????????int?ret;
????????struct?sigaction?sig;
????????struct?sigaction?osig;
????????sig.sa_handler?=?func;
????????sigemptyset(&sig.sa_mask);
????????sig.sa_flags?=?0;
#ifdef?SA_RESTART
????????sig.sa_flags?|=?SA_RESTART;
#endif?/*?SA_RESTART?*/
????????ret?=?sigaction(signo?&sig?&osig);
????????if?(ret?0)
????????????????return?(SIG_ERR);
??????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????1150??2010-11-29?11:01??rawsock\ping.h
?????文件???????3332??2010-11-29?10:58??rawsock\main.cpp
?????文件??????10990??2010-11-29?15:00??rawsock\ping.cpp
?????目錄??????????0??2010-12-13?23:44??rawsock
-----------?---------??----------?-----??----
????????????????15472????????????????????4
評論
共有 條評論