DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: lixuan123
今日帖子: 21
在线用户: 9
导航: 论坛 -> 网络通讯 斑竹:liumazi,sephil  
作者:
男 liskman (liskman) ★☆☆☆☆ -
普通会员
2020/11/5 11:19:22
标题:
IdIcmpClient执行Ping时报错误Socket Error # 10040 浏览:2199
加入我的收藏
楼主: 使用IdIcmpClient组件编写一个Ping一段IP的代码,发现Ping函数有偶发性的抛出异常Socket Error # 10040 Message too long.
请问有没有解决办法。
发现不在线的IP,Ping函数出异常的概率更大一些。

测试代码如下:

unsigned int nIPStart;
unsigned int nIPStop;
unsigned int nIP;
int nBufSize;
String strLine;
String sttInfo;
String strBuffer;

nIPStart = 0xC0A8011E;//192.168.1.30
nIPStop  = 0xC0A80128;//192.168.1.40
Memo1->Lines->Clear();

for( nIP = nIPStart; nIP <= nIPStop; nIP++ )
{
  strLine.sprintf(L"%03d.%03d.%03d.%03d   ",
    (nIP>>24)&0x0FF, (nIP>>16)&0x0FF, (nIP>>8)&0x0FF, (nIP>>0)&0x0FF );
  IdIcmpClient1->Host = strLine;
  IdIcmpClient1->ReceiveTimeout = 450;
  IdIcmpClient1->PacketSize = 32;
  IdIcmpClient1->Protocol = 1;
  IdIcmpClient1->IPVersion = Id_IPv4;

  nBufSize = 1024 * 128;
  IdIcmpClient1->Binding->SetSockOpt(Id_SOL_SOCKET, Id_SO_SNDBUF, nBufSize );
  IdIcmpClient1->Binding->SetSockOpt(Id_SOL_SOCKET, Id_SO_RCVBUF, nBufSize );

  try
  {
    strBuffer = StringOfChar('X',IdIcmpClient1->PacketSize);
    IdIcmpClient1->Ping(strBuffer);
    Sleep(500);
    if( IdIcmpClient1->ReplyStatus->ReplyStatusType == rsEcho )
    {
      sttInfo.sprintf(L"%03d.%03d.%03d.%03d 响应 时间=%dms",
        (nIP>>24)&0x0FF, (nIP>>16)&0x0FF, (nIP>>8)&0x0FF, (nIP>>0)&0x0FF,
        IdIcmpClient1->ReplyStatus->MsRoundTripTime );
    }
    else
    {
      sttInfo.sprintf(L"%03d.%03d.%03d.%03d 超时",
        (nIP>>24)&0x0FF, (nIP>>16)&0x0FF, (nIP>>8)&0x0FF, (nIP>>0)&0x0FF );
    }

  }catch(Exception &exception){
    strLine = exception.ToString();
    strLine = StringReplace(strLine, L"\r\n", L"  ", TReplaceFlags()<<rfReplaceAll<<rfIgnoreCase );
    sttInfo.sprintf(L"%03d.%03d.%03d.%03d 异常 %s",
        (nIP>>24)&0x0FF, (nIP>>16)&0x0FF, (nIP>>8)&0x0FF, (nIP>>0)&0x0FF,
        strLine.c_str() );
    Sleep(500);
  }

  Memo1->Lines->Add(sttInfo);
}
此帖子包含附件:
PNG 图像
大小:5.9K
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2020/11/5 13:57:44
1楼: https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&ch=6&tn=myie2dg&wd=ping%20socket%2010040&oq=socket%252010040&rsv_pq=d16869390001ecf5&rsv_t=662aE3aYMIiFZrypwCQsTukyTCyaNEkTNNzJ3hdN74vlDI1k%2BsWqeyTJfUT6Kg&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=6&rsv_sug1=1&rsv_sug7=100&rsv_sug2=0&rsv_btype=t&inputT=1805&rsv_sug4=2674

腾讯云说他有答案,但是不知道 有没有用。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 liskman (liskman) ★☆☆☆☆ -
普通会员
2020/11/5 15:30:49
2楼: 已经参考这个8年前的贴子的 "magic" fix 方法
https://stackoverflow.com/questions/12723081/delphi-indy-ping-error-10040
加空格,加Ping函数参数,指定包长度等,代码中都有体现,好像没有什么用处。

我的环境是 C++Builder 10.1 Update 2。

请教有没有解决办法。
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2020/11/12 21:11:25
3楼: 你可以试一下把IdIcmpClient1及其操作放在线程里面。 indy的东西最好都放在线程里面。

如果不想做线程,可以试一下在Form里面增加一个TIdAntiFreeze组件。
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/11/13 16:18:58
4楼: 报错,异常,都是很正常的事情。

底层程序异常,上层需要处理异常。
----------------------------------------------
-
作者:
男 bluestorm8 (bluestorm) ▲▲△△△ -
普通会员
2020/11/16 10:14:17
5楼: IdIcmp的时延(RoundTripTime)是不准确的,真的不好用,建议改为调用windows的icmp.dll里面的IcmpSendEcho函数,得到的结果跟ping完全一样,而且并不复杂,没有IdIcmp那么多莫名奇妙的东西。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS