我在创建的ICMP类中定义一个套接字:winsock,然后接收:
BOOL CICMP::ReceiveICMPPack(char *pAddr)      //参数为外部输入的地址,从它那将回到来数据报.
{
sockaddr_in sockAddr;
memset((void *)&sockAddr,0,sizeof(sockAddr));
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = 0;
sockAddr.sin_addr.S_un.S_addr=inet_addr(pAddr); bind(winsock, (PSOCKADDR)&sockAddr, sizeof(sockAddr));

memcpy((void *)&m_sockAddr,(void *)&sockAddr,
sizeof(sockaddr_in));
//___________________________________
    TRACE("RECV 1  ");
return ReceiveICMPPack();
}//----------------------接收数据----------------------------
BOOL CICMP::ReceiveICMPPack()
{
int state;
state=0;
int len = sizeof(sockaddr_in);
// sockaddr_in my_addr;
    struct hostent *pHost = NULL; TRACE("After bind");
state = recvfrom(winsock,recvbuff,MAX_PACKET,0,
(struct sockaddr*)&m_sockAddr,&len);
TRACE("RECV DONE ");
if (state == SOCKET_ERROR) 
{
m_strInfo="接收失败!";
return FALSE;
}
    TRACE(" Fenxishuju ");
//分析数据
int ipheadlen;
ipheadlen = m_pIp->HeadLen * 4 ; if (state < (ipheadlen+MIN_PACKET))
{
m_strInfo = "目的地址的响应数据不正确";
return FALSE;
}
m_pIcmp = (ICMP_HEAD*)((char *)recvbuff + ipheadlen);
type = (char*)((char *)recvbuff+sizeof(ICMP_HEAD));
IpOrPort = (char*)((char *)recvbuff+2*sizeof(char));
num = (char *)((char *)recvbuff+3*sizeof(char));
deal = (char *)((char *)recvbuff+4*sizeof(char));
}
---------------------------------------------------------
线程:
struct SubThreadInfo
{
CDialog* pDialog;
CListCtrl* list;
CStatic* state;
CString IPStr;
CEdit* Number;

} Info;CEvent eventStopReceive;
//-----------------接收线程---------------
UINT ThreadReceive(LPVOID pParam)          
{
SubThreadInfo* pInfo = (SubThreadInfo*)pParam;
CReceiveICMPDlg* pThreadDlg = (CReceiveICMPDlg*)pInfo->pDialog; CICMP m_icmp;
CString IPStr=pInfo->IPStr;
CString strI;
CString s;
BOOL flag;
TRACE("START THREAD\n"); m_icmp.Initialize();
TRACE("After Intialization\n");
for(int i=0;i<=30;i++)///////////////////////////////////数据包的最大接收数目
{
if(m_icmp.ReceiveICMPPack((char *)(LPCSTR)IPStr))  
{
TRACE("HERER");
flag=m_icmp.ReceiveICMPPack();
}
TRACE("AFTER IF"); if(flag==TRUE)
{
  s.Format("%d",i);
  int j=pInfo->list->InsertItem(0,s);
  strI.Format("%d",i);
      pInfo->list->SetItemText(i,1,m_icmp.type);
      pInfo->list->SetItemText(i,2,m_icmp.IpOrPort);
  pInfo->list->SetItemText(i,3,m_icmp.num); 
  pInfo->list->SetItemText(i,4,m_icmp.deal); 
  pInfo->state->SetWindowText(m_icmp.m_strInfo);
    pInfo->Number->SetSel(0,-1);
  pInfo->Number->ReplaceSel(strI);
  Sleep(100);
  flag=FALSE;
}if(WaitForSingleObject(eventStopReceive.m_hObject, 0) == WAIT_OBJECT_0)
 break;
}
   pThreadDlg->Routeflag=TRUE;
   return 0;
}
------------------------------------------
按钮函数:
void CReceiveICMPDlg::OnStart() 
{
// TODO: Add your control notification handler code here
CString str;
UpdateData(TRUE);
CWnd * pWnd;
pWnd = GetDlgItem(IDC_COMBO);
pWnd->GetWindowText(str);
   TRACE("Start Routine\n"); if(str.IsEmpty()) {
MessageBox("请输入地址!");
pWnd->SetFocus();
return;
}
   if (m_comb.FindStringExact(-1, str) == CB_ERR)
  m_comb.AddString(str);     m_list.DeleteAllItems();
 if(Routeflag)
 {
   Routeflag=FALSE;
   Info.IPStr=str;
   Info.pDialog=this;
   Info.Number=(&m_number);
   Info.list=(&m_list);
   Info.state=(&m_state);
       AfxBeginThread(ThreadReceive, &Info);
   MessageBox("over");
 }

}
我的问题是:接收的数据报一直在整加,但为什么除第一个包正常显示为其他的都是空???
如果解决不了,而又有真心希望帮下我这个菜鸟的大大们,留下邮箱,我把工程发给你们,请你们帮我好好看看?