我在创建的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");
}
}
我的问题是:接收的数据报一直在整加,但为什么除第一个包正常显示为其他的都是空???
如果解决不了,而又有真心希望帮下我这个菜鸟的大大们,留下邮箱,我把工程发给你们,请你们帮我好好看看?
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");
}
}
我的问题是:接收的数据报一直在整加,但为什么除第一个包正常显示为其他的都是空???
如果解决不了,而又有真心希望帮下我这个菜鸟的大大们,留下邮箱,我把工程发给你们,请你们帮我好好看看?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货