ICMP编程问题!!recvfrom接收不到数据!!!急急急急急急急急急急急急!!
#pragma comment(lib,"ws2_32.lib")
#include <STDIO.H>
#include <WINSOCK2.H>
#include <WS2TCPIP.H>
#include <PROCESS.H>
#include <Winsock.h>
#include <string.h>
#include <iostream>
#include <string>
using namespace std;
typedef struct iphdr{
unsigned char ver_hlen;
unsigned char tos;
unsigned short total_len;
unsigned short ident;
unsigned short frag_and_flags;
unsigned char ttl;
unsigned char proto;
unsigned short checksum;
unsigned int sourceIP;
unsigned int destIP;
}IPHeader;
typedef struct icmphdr{
unsigned char type;
unsigned char code;
unsigned short cksum;
unsigned short id;
unsigned short seq;
}ICMPHeader;
发送端:
#include "Server1.h"
#include <STDIO.H>
#include <WINSOCK2.H>
#include <WS2TCPIP.H>
#include <PROCESS.H>
#include <Winsock.h>
#define ICMP_ECHO_REPLY 0
#define ICMP_ECHO_REQUEST 8
#define PACKAGE_SIZE sizeof(IPHeader)+sizeof(ICMPHeader)+128
#define destip "127.0.0.1"
#include <string.h>
#include <iostream>
#include <string>
using namespace std;
#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))
#define xfree(p) HeapFree(GetProcessHeap(),0,(p))
void HandlenError(char *func);
void FillPackage(char* pData,unsigned long,u_short id);
u_short CheckSum(u_short *,int);
void main()
{
SOCKET sock;
int pid=_getpid();//得到一个进程号
unsigned long dstIP;
dstIP=inet_addr(destip);
WSAData wsaData;
WSAStartup(WINSOCK_VERSION,&wsaData);
sock=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
if(sock==SOCKET_ERROR)
{
printf("socket failed!");
}
struct sockaddr_in to;
memset(&to,0,sizeof(to));
to.sin_addr.s_addr=dstIP;
to.sin_family=AF_INET;
int len=sizeof(to);
char* buf=(char *)xmalloc(PACKAGE_SIZE);
while(1)
{
FillPackage(buf,dstIP,(u_short) pid);
Sleep(1000);
sendto(sock,buf,PACKAGE_SIZE,0,(struct sockaddr *)&to,len);
if(sendto(sock,buf,PACKAGE_SIZE,0,(struct sockaddr *)&to,len))
{
printf("ok\n");
}
}
xfree(buf);
closesocket(sock);
WSACleanup();
}
void FillPackage(char* pData,unsigned long destIP,u_short id)
{
int n;
char hostname[256];
static sockaddr_in sa;
hostent *Host;
gethostname(hostname,sizeof(hostname));
Host=gethostbyname(hostname);
for(n=0;Host->h_addr_list[n];n++)
{
memcpy(&sa.sin_addr.s_addr,Host->h_addr_list[n],Host->h_length);
}
memset(pData,0,PACKAGE_SIZE);
int nVersion=4;
int nHeadSize=sizeof(IPHeader);
unsigned long srcIP=sa.sin_addr.s_addr;
unsigned long deIP=destIP;
IPHeader *pIPHeader=(IPHeader *) pData;
pIPHeader->ver_hlen=(nVersion<<4)|nHeadSize;
pIPHeader->tos=0;
pIPHeader->total_len=htons(PACKAGE_SIZE);
pIPHeader->ident=htons(1234);
pIPHeader->frag_and_flags=0;
pIPHeader->ttl=255;
pIPHeader->proto=IPPROTO_ICMP;
pIPHeader->checksum=0;
pIPHeader->sourceIP=srcIP;
pIPHeader->destIP=deIP;
pIPHeader->checksum=CheckSum((USHORT *) pData,sizeof(IPHeader));
ICMPHeader *pICMPHeader=(ICMPHeader *)(pData+sizeof(IPHeader));
pICMPHeader->type=ICMP_ECHO_REQUEST;
pICMPHeader->code=0;
pICMPHeader->id=htons(id);
pICMPHeader->seq=htons(id);
pICMPHeader->cksum=CheckSum((USHORT *)((char *)pData+sizeof(IPHeader)),sizeof(ICMPHeader));
char *icmp_data;
icmp_data=pData;
memset(icmp_data,0,PACKAGE_SIZE-(sizeof(IPHeader)+sizeof(ICMPHeader)));
}
USHORT CheckSum(USHORT *pUShort,int size)
{
unsigned long cksum=0;
while(size>1)
{
cksum += *pUShort++;
size-=sizeof(USHORT);
}
if(size)
{
cksum+=*(UCHAR *)pUShort;
}
cksum=(cksum>>16)+(cksum & 0xffff);
cksum+=(cksum>>16);
return (USHORT)(~cksum);
}
void HandlenError(char *func)
{
int errCode=WSAGetLastError();
char info[65]={0};
_snprintf(info,64,"%s: %d\n",func,errCode);
printf(info);
}
接收端:
#include "client.h"
#include <STDIO.H>
#include <WINSOCK2.H>
#include <WS2TCPIP.H>
#include <PROCESS.H>
#include <Winsock.h>
#define ICMP_ECHO_REPLY 0
#define ICMP_ECHO_REQUEST 8
#define PACKAGE_SIZE sizeof(IPHeader)+sizeof(ICMPHeader)+128
#include <string.h>
#include <iostream>
#include <string>
using namespace std;
#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))
#define xfree(p) HeapFree(GetProcessHeap(),0,(p))
void main()
{
SOCKET sock;
WSAData wsaData;
WSAStartup(WINSOCK_VERSION,&wsaData);
sock=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
if(sock==SOCKET_ERROR)
{
printf("socket failed!");
}
struct sockaddr_in from;
int len=sizeof(from);
// char* buf=(char *)xmalloc(PACKAGE_SIZE);
char buf[PACKAGE_SIZE];
// memset(buf,0,PACKAGE_SIZE);
memset(&from,0,sizeof(from));
from.sin_addr.s_addr=INADDR_ANY;
from.sin_family=AF_INET;
from.sin_port=htons(999);
bind(sock,(struct sockaddr *)&from,len);
while(1)
{
Sleep(1000);
if(recvfrom(sock,buf,PACKAGE_SIZE,0,(struct sockaddr *)&from,&len))
{
printf("ok\n");
}
IPHeader *pIPHdr=(IPHeader *)buf;
ICMPHeader *pICMPHdr=(ICMPHeader *)(buf+sizeof(IPHeader));
printf("%s\n",inet_ntoa(from.sin_addr));
}
xfree(buf);
closesocket(sock);
WSACleanup();
}
接收端接收不到任何东西!!一直处于接收状态!!
是什么问题???
希望大家快点帮我解决!!谢谢!!!