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
发给我看看