SOCKET sRaw =WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED);
.....
nRet=::sendto(sRaw,buf,sizeof(ICMP_HDR)+32,0,(SOCKADDR*)&dest,sizeof(dest));
if(nRet==SOCKET_ERROR)
{
MessageBox("测速失败","错误",MB_OK);
return 0;
::GetLastError();
}
nRet=recvfrom(sRaw,recvBuf,512,0,(sockaddr*)&from,&len);
if(nRet==SOCKET_ERROR)
if(::GetLastError()==WSAETIMEDOUT)
{
miss++;
count++;
continue;
}
问题是这个 recvfrom一直是接受超时?想不明白怎么回事,大家指教一下,谢谢
.....
nRet=::sendto(sRaw,buf,sizeof(ICMP_HDR)+32,0,(SOCKADDR*)&dest,sizeof(dest));
if(nRet==SOCKET_ERROR)
{
MessageBox("测速失败","错误",MB_OK);
return 0;
::GetLastError();
}
nRet=recvfrom(sRaw,recvBuf,512,0,(sockaddr*)&from,&len);
if(nRet==SOCKET_ERROR)
if(::GetLastError()==WSAETIMEDOUT)
{
miss++;
count++;
continue;
}
问题是这个 recvfrom一直是接受超时?想不明白怎么回事,大家指教一下,谢谢
解决方案 »
- 数据库表数据比较的优化问题
- 在线问一个有关通信协议的问题
- COM组件接收UTF-8编码问题
- 哪位高手能帮帮忙!谢谢!! 用VC在word中画曲线时,总提示越界错。
- 在2000 或者xp环境下 AllocCsToDsAlias函数在哪个模块啊?
- 我用ReadFile(handleCom1,&fReadData,10,&nReadNmb,NULL);读端口时为什么程序会死掉?上面的函数参数10是要求读10个长度的数据,是不是
- 怎么做到动态的toolbar 谢谢
- 请问:怎样在SDI启动的页面中显示个资源管理器
- vc++调试跟踪的问题
- 求助!如何替换DLL?
- 如何设置WEB页面为桌面墙纸.100分在线等.
- 调用多语言资源DLL之后,CFormView::Create()里,_AfxCheckDialogTemplate输出Cannot find dialog template with IDD 0x00AB.
本来我照一本书上写的是 SOCKET sRaw=::socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);,然后书
上又用了一个SetTimeout函数来设置超时,但这个函数VC中好像没有,没办法我看了ping的源码,看到里面的是用WSASocket(AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED);来创建套接字,然后好像是用setsockopt来设置超时,于是我就给弄了过来,结果
我试了一下用SOCKET sRaw=::socket(AF_INET,SOCK_RAW,IPPROTO_ICMP)然后也可以用setsockopt来设置超时,但是最终还是recvfrom总是接收超时,修改变后的部分代码如下:
SOCKET sRaw=::socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
//下面为设置超时
bread=setsockopt(sRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));
timeout=1000;
bread=setsockopt(sRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout, sizeof(timeout));
....
//下面为填充封包数据
char buf[sizeof(ICMP_HDR)+32];
ICMP_HDR *pIcmp=(ICMP_HDR*)buf;
pIcmp->icmp_type=8;
pIcmp->icmp_code=0;
pIcmp->icmp_id=(USHORT)::GetCurrentProcessId();
pIcmp->icmp_checksum=0;
pIcmp->icmp_sequence=0;
memset(&buf[sizeof(ICMP_HDR)],'e',32);
pIcmp->icmp_checksum=0;
pIcmp->icmp_timestamp=::GetTickCount();
pIcmp->icmp_sequence=nseq++;
pIcmp->icmp_checksum=checksum((USHORT*)buf,sizeof(ICMP_HDR)+32);
....
//以下为发送与接收数据
nRet=::sendto(sRaw,buf,sizeof(ICMP_HDR)+32,0,(SOCKADDR*)&dest,sizeof(dest));
if(nRet==SOCKET_ERROR)
{
MessageBox("测速失败","错误",MB_OK);
::WSAGetLastError();
return 0;
}
nRet=recvfrom(sRaw,recvBuf,1024,0,(sockaddr*)&from,&len);
if(nRet==SOCKET_ERROR)
if(::WSAGetLastError()==WSAETIMEDOUT)
{
miss++;
count++;
continue;
}
最终还是这个 recvfrom问题,如常觉得好解决了就帮下我,如果很麻烦了那就算了,我再慢慢看书吧,这两天的问题麻烦你了,谢谢哈