资源简介
利用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 < MAX_SEND_TIME)
{
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
评论
共有 条评论