如何编程检测到自己被PING?象天网那样??
解决方案 »
- 数据转换
- 为什么VC7.1(Visual studio2003)的MSDN,在“索引”搜索出来的,全都是for Windows CE?
- button重画之后的问题
- CSocket指针循环的问题
- CPropertySheet 回车 问题
- ***请问有将delphi原代码转换成vc代码的工具吗?***
- 谁能给我写一个VXD,功能是不进入WINDOWS后不响应键盘和鼠标的输入,直到加载成功我自已的程序后再解锁!我愿出1000RMB,邮箱是chenglsm@
- 编译通过,连接出错,怎么办?
- 我想得到OLEVIEW的核心代码,用来实现以下功能:
- 如何禁用这样的菜单项
- 如何制作avi的播放器,谢谢提示
- 如何编一个全线程快捷键(类似系统快捷键)
http://winpcap.polito.it/
如果你想研究在Unix-like平台下如何做这事,看libcap:
http://www.tcpdump.org/它们都有原码。
不难的。
现在我想实现像防火墙那样关闭一个端口的功能,哪位大侠给点提示!
{
BYTE i_type;
BYTE i_code;
USHORT i_cksum;
USHORT i_id;
USHORT i_seq;
} ICMP;
typedef ICMP * LPICMP;
typedef ICMP UNALIGNED * ULPICMP;typedef struct _IP{
union
{
BYTE Version; // °æ±¾
BYTE HdrLen; // IHL
};
BYTE ServiceType; // ·þÎñÀàÐÍ
WORD TotalLen; // ×ܳ¤
WORD ID; // ±êʶ
union
{
WORD Flags; // ±êÖ¾
WORD FragOff; // ·Ö¶ÎÆ«ÒÆ
};
BYTE TimeToLive; // ÉúÃüÆÚ
BYTE Protocol; // ЭÒé
WORD HdrChksum; // ͷУÑéºÍ
DWORD SrcAddr; // Ô´µØÖ·
DWORD DstAddr; // Ä¿µÄµØÖ·
BYTE Options; // Ñ¡Ïî
} IP;
typedef IP * LPIP;
typedef IP UNALIGNED * ULPIP;
//////////////////////////////
UINT PingThread(LPVOID lp)
{
CRightView * pDlg=(CRightView*)lp;
BOOL mobileflag=pDlg->user_config.PortConfig.sendflag; WSADATA WSAData;
SOCKET sock;
int flag=0;
char LocalName[256]={0}; // ¼ì²é Winsock °æ±¾ºÅ£¬WSADataΪWSADATA½á¹¹¶ÔÏó
WSAStartup(MAKEWORD(2, 2), &WSAData);
// ´´½¨Ô­Ê¼Ì×½Ó×Ö
sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
// ÉèÖÃIPÍ·²Ù×÷Ñ¡ÏÆäÖÐflag ÉèÖÃΪture£¬Ç××Ô¶ÔIPÍ·½øÐд¦Àí
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));
// »ñÈ¡±¾»úÃû
gethostname((char*)LocalName, sizeof(LocalName)-1);
// »ñÈ¡±¾µØ IP µØÖ·
struct hostent *pHost = gethostbyname((char*)LocalName);
// Ìî³äSOCKADDR_IN½á¹¹
SOCKADDR_IN addr_in; addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IP
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(57274);
// °ÑԭʼÌ×½Ó×Ösock °ó¶¨µ½±¾µØÍø¿¨µØÖ·ÉÏ
bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in));
// dwValueΪÊäÈëÊä³ö²ÎÊý£¬Îª1ʱִÐУ¬0ʱȡÏû
DWORD dwValue = 1;
// ÉèÖà SOCK_RAW ΪSIO_RCVALL£¬ÒÔ±ã½ÓÊÕËùÓеÄIP°ü¡£ÆäÖÐSIO_RCVALL
// µÄ¶¨ÒåΪ£º #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
ioctlsocket(sock, SIO_RCVALL, &dwValue); char RecvBuf[4096]={0};
int size =4096; CString icmp_type,ip_from,ip_to,pack_size; int times=pDlg->user_config.PortConfig.PingTimes;
CTime t;
int first=-1,last=0;//µ±Ç°·ÖÖÓ
while (!pDlg->stop)
{
// ½ÓÊÕԭʼÊý¾Ý°üÐÅÏ¢
int ret = recv(sock, RecvBuf, size, 0);
if (ret > 0)
{
// ¶ÔÊý¾Ý°ü½øÐзÖÎö£¬²¢Êä³ö·ÖÎö½á¹û
_IP ip = *(IP*)RecvBuf; if(ip.Protocol==1)
{
_ICMP icmp = *(ICMP*)(RecvBuf+20);
if(icmp.i_type==8) ///ping ÇëÇó
{
icmp_type="ÇëÇó";
}
if(icmp.i_type==0) ///ping ´ðÓ¦
{
icmp_type="´ðÓ¦";
}
if(icmp.i_type==0||icmp.i_type==8)
{
if(first==-1)
{
t=CTime::GetCurrentTime();
first=t.GetMinute();
}
ip_from.Format("%s",inet_ntoa(*(in_addr*)&ip.SrcAddr));
ip_to.Format("%s",inet_ntoa(*(in_addr*)&ip.DstAddr));
pack_size.Format("%d",ntohs(ip.TotalLen));
pDlg->m_list_ping.InsertItem(0,icmp_type);
pDlg->m_list_ping.SetItemText(0,1,ip_from);
pDlg->m_list_ping.SetItemText(0,2,ip_to);
pDlg->m_list_ping.SetItemText(0,3,pack_size);
times--;
if(!times)
{
/*Send to Server*/
t=CTime::GetCurrentTime();
last=t.GetMinute();
if(last==first)
{
EnterCriticalSection(&pDlg->mutex);
pDlg->send_msg.m_error_msg="±»PING´ÎÊý´óÓÚ·§Öµ";
if(mobileflag)
{
pDlg->send_msg.m_error_level="·¢ËÍÖÁСÁéͨ";
}
else pDlg->send_msg.m_error_level="·¢ËÍÖÁ·þÎñÆ÷"; AfxBeginThread(&SendThread,pDlg);
LeaveCriticalSection(&pDlg->mutex);
times=pDlg->user_config.PortConfig.PingTimes;
first=-1;
}
else
{
first=-1;
times=pDlg->user_config.PortConfig.PingTimes;
}
}
}
} }
}
AfxEndThread(0);
return 0;
}