|
|
导航: |
论坛 -> 网络通讯
斑竹:liumazi,sephil |
|
作者: |
|
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); }
此帖子包含附件:
大小:5.9K |
----------------------------------------------
- |
作者: |
|
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
|
作者: |
|
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。
请教有没有解决办法。
----------------------------------------------
-
|
作者: |
|
2020/11/12 21:11:25 |
3楼: |
你可以试一下把IdIcmpClient1及其操作放在线程里面。 indy的东西最好都放在线程里面。
如果不想做线程,可以试一下在Form里面增加一个TIdAntiFreeze组件。
----------------------------------------------
-
|
作者: |
|
2020/11/13 16:18:58 |
4楼: |
报错,异常,都是很正常的事情。
底层程序异常,上层需要处理异常。
----------------------------------------------
-
|
作者: |
|
2020/11/16 10:14:17 |
5楼: |
IdIcmp的时延(RoundTripTime)是不准确的,真的不好用,建议改为调用windows的icmp.dll里面的IcmpSendEcho函数,得到的结果跟ping完全一样,而且并不复杂,没有IdIcmp那么多莫名奇妙的东西。
----------------------------------------------
-
|
|