用icmp写一个ping的程序(下面这段代码只是socket初始化和报文发送接受的部分,不包含接受后对icmp报文的分析)
我的这段程序哪里有问题,为什么可以发但不能收,每次都rec timeout????请教!!!!
#define packdata 10
WSADATA wsadata;
sockaddr_in destaddr,from;
SOCKET sockclient;
char *pdata;
icmphead *picmp;
int ippacketsize;
char *ipdatatol;
typedef struct tagIPHEADER
{
unsigned char version;
unsigned char head_length;
unsigned char sever_type;
unsigned short total_length;
unsigned short indent;
unsigned short flag_flag;
unsigned char ttl;
unsigned char pro;
unsigned short checksum;
unsigned int sourceip;
unsigned int destip;
}iphead;typedef struct tagICMPHEADER
{
unsigned char type;
unsigned char code;
unsigned short checksum;
unsigned short icmp_indent;
unsigned short seq;
unsigned long timestamp;
}icmphead;
void CIpcDlg::OnOK() 
{    int timeout=1000;
int timeoutrec=1000;
if(SOCKET_ERROR==::WSAStartup(0x202,&wsadata))
{
int errcode=::WSAGetLastError (); 
::AfxMessageBox("init error!");
::exit(0); 

}
destaddr.sin_family=AF_INET;
destaddr.sin_addr.s_addr=::inet_addr("127.0.0.1") ; sockclient=::socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
::setsockopt(sockclient,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeoutrec,sizeof(timeoutrec));
::setsockopt(sockclient,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(timeout));
if(SOCKET_ERROR==sockclient)
{
int errcode=::WSAGetLastError ();
{
::AfxMessageBox("sock error!");

::WSACleanup();
::closesocket(sockclient);


}
}            
int packetsize=packdata+sizeof(icmphead);
int ippacketsize=packetsize+sizeof(iphead);
char *picmpdatatol=new char[packetsize];
char *ipdatatol=new char[ippacketsize];
::memset(picmpdatatol,0,packetsize); picmp=(icmphead *)picmpdatatol;
picmp->type=8;
picmp->code=0;
picmp->icmp_indent=(unsigned short)::GetCurrentProcessId();
picmp->seq=0;
pdata=picmpdatatol+sizeof(icmphead);
::memset(pdata,'a',packetsize-sizeof(icmphead));
::SetTimer(this->m_hWnd,1,2000,NULL);   }void CIpcDlg::OnTimer(UINT nIDEvent) 
{ char *recbuffer=new char[ippacketsize];
int reclength=sizeof(from);
if(SOCKET_ERROR==::sendto(sockclient,ipdatatol,ippacketsize,0,(struct sockaddr *)&destaddr,sizeof(destaddr)))
{
if(WSAETIMEDOUT==::WSAGetLastError()) 
{
::AfxMessageBox("timeout");
}
else
{
::AfxMessageBox("error!");
::KillTimer(this->m_hWnd ,1);
}
::exit(1); 
}
if(SOCKET_ERROR==::recvfrom(sockclient,recbuffer,ippacketsize,0,(struct sockaddr *)&from,&reclength))

{
if(WSAETIMEDOUT==::WSAGetLastError()) 
{
::AfxMessageBox("rec timeout");
}

else
{
::AfxMessageBox("rec error!");
::KillTimer(this->m_hWnd ,1);
}
::exit(1); 
}

char *p=::inet_ntoa(from.sin_addr );
m_list.AddString(p); 

}