首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

recvfrom 这个函数总是失败,这是为什么呢?该如何处理

2012-03-30 
recvfrom 这个函数总是失败,这是为什么呢?revcfrom这个函数貌似是阻塞的吧,意识是:只有收到,否则是不会返

recvfrom 这个函数总是失败,这是为什么呢?
revcfrom
这个函数貌似是阻塞的吧,意识是:只有收到,否则是不会返回的。所以,要设置时间。

自定义的SetTime函数来设置时间。


我正在写一个模拟ping的小程序,老是出问题。

郁闷的很,运行到recvfrom就出错。 请不要告诉我,关闭防火墙之类,我早已经关闭了,我是ping自己的电脑


程序界面上有个ip地址、文本框,和一个按钮,。。。。文本框用来显示结果的。



void CPing::OnPing() 
{
SetTimeout(s, 1000); //设置超时

unsigned char B[4];
m_Ip.GetAddress(B[0],B[1],B[2],B[3]);//获得编辑框中输入的IP地址

  struct in_addr IP;
memcpy(&IP.S_un.S_addr,B,4);

  //存放 到 目的端地址 结构体 中
SOCKADDR_IN dest;
dest.sin_family=AF_INET;
dest.sin_port=htons(0);
  dest.sin_addr.S_un.S_addr=IP.S_un.S_addr;  

//-----------------------------------------------------------
ICMPHeader *pIcmp; 
ICMPHeader *pRecvICMP;
char buff[sizeof(ICMPHeader) +5]; //5:要发送的信息占5B 
pIcmp=(ICMPHeader*)buff;  


// 开始发送和接收ICMP封包
USHORTnSeq = 0;  
char recvBuff[1024];
SOCKADDR_IN from;
int nLen = sizeof(from);

 for(int nCount = 0;nCount< 4;nCount++)
 { // 填写要发送的ICMP封包数据
pIcmp->icmp_type = 8;
pIcmp->icmp_code = 0;
pIcmp->icmp_id = (unsigned short)GetCurrentProcessId();  
pIcmp->icmp_checksum = 0;
pIcmp->icmp_sequence = nSeq++;
pIcmp->icmp_timestamp = GetTickCount();
memset(&buff[sizeof(ICMPHeader)], '0', 5); 
pIcmp->icmp_checksum = CheckSum((USHORT*)buff, sizeof(ICMPHeader)+5 );

//发送
int nRet = ::sendto(s, buff,sizeof(ICMPHeader)+5, 0, (SOCKADDR *)&dest, sizeof(dest));
if(nRet == SOCKET_ERROR)
{MessageBox("调用sendto()失败");  
break;  
}

//成功发送了,现在开始解析收回来的数据包
  CString result="";

nRet=::recvfrom(s,recvBuff,1024,0,(SOCKADDR*)&from,&nLen); //接受数据
if(nRet==SOCKET_ERROR)
{
if(::GetLastError()==WSAETIMEDOUT) //超时错误
{

result+="超时错误!\r\n";
this->SetDlgItemText(IDC_RESULT,result);
continue;
}

//不是超时而产生的错误,则提示
result+="调用recvfrom产生其他错误!\r\n";
this->SetDlgItemText(IDC_RESULT,result);
break;

}............

................

} //end for

} //end OnPing

[解决办法]
HowToP2p@163.com
发给我看看

热点排行