ICE 域名解析耗時太長
當dns伺服器設定錯誤,或者解析的域名是錯誤的域名時,ICE 域名解析耗時太長,20秒左右,發現它是使用getaddrinfo 函式進行域名解析的,並且最大迴圈5次;
vector<struct sockaddr_in>
IceInternal::getAddresses(const string& host, int port, bool server, bool blocking)
{
vector<struct sockaddr_in> result;
struct sockaddr_in addr;
memset(&addr, 0, sizeof(struct sockaddr_in));
#ifdef GUMSTIX
//
// Gumstix does not support calling getaddrinfo with empty host.
//
if(host.empty())
{
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
if(server)
{
addr.sin_addr.s_addr = htonl(INADDR_ANY);
}
else
{
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
}
result.push_back(addr);
return result;
}
#endif
struct addrinfo* info = 0;
int retry = 5;
struct addrinfo hints = { 0 };
hints.ai_family = PF_INET;
if(!blocking)
{
hints.ai_flags = AI_NUMERICHOST;
}
if(server)
{
//
// If host is empty, getaddrinfo will return the wildcard
// address instead of the loopack address.
//
hints.ai_flags |= AI_PASSIVE;
}
int rs = 0;
do
{
if(host.empty())
{
rs = getaddrinfo(0, "1", &hints, &info); // Get the address of the loopback interface
}
else
{
rs = getaddrinfo(host.c_str(), 0, &hints, &info);
}
}
while(info == 0 && rs == EAI_AGAIN && --retry >= 0);
// In theory, getaddrinfo should only return EAI_NONAME if AI_NUMERICHOST is specified and the host name
// is not a IP address. However on some platforms (e.g. Mac OS X 10.4.x) EAI_NODATA is also returned so
// we also check for it.
#ifdef EAI_NODATA
if(!blocking && (rs == EAI_NONAME || rs == EAI_NODATA))
#else
if(!blocking && rs == EAI_NONAME)
#endif
{
return result; // Empty result indicates that a blocking lookup is necessary.
}
if(rs != 0)
{
DNSException ex(__FILE__, __LINE__);
ex.error = rs;
ex.host = host;
throw ex;
}
struct addrinfo* p;
for(p = info; p != NULL; p = p->ai_next)
{
assert(p->ai_family == PF_INET);
memcpy(&addr, p->ai_addr, p->ai_addrlen);
struct sockaddr_in* sin = reinterpret_cast<sockaddr_in*>(&addr);
sin->sin_port = htons(port);
bool found = false;
for(unsigned int i = 0; i < result.size(); ++i)
{
if(compareAddress(result[i], addr) == 0)
{
found = true;
break;
}
}
if(!found)
{
result.push_back(addr);
}
}
freeaddrinfo(info);
if(result.size() == 0)
{
DNSException ex(__FILE__, __LINE__);
ex.host = host;
throw ex;
}
return result;
}
網上有對該函式設定超時的解決方案http://www.cppblog.com/converse/archive/2009/11/07/100349.html
http://www.cnblogs.com/cxz2009/archive/2010/11/19/1881693.html
http://bbs.chinaunix.net/thread-1433843-1-1.html相關文章
- 域名解析耗時是什麼?域名解析耗時影響因素有哪些?
- 交流(二)--分割槽表統計分析耗時太長
- 微軟更新太複雜 美夏令時間轉換IT人員耗時大微軟
- 猜拳小遊戲——耗時好長要瘋了遊戲
- 如何在耗時較長的操作完成後得到提醒?
- echarts X軸類目名太長時隱藏,hover時顯示全部Echarts
- TypeScript In ICETypeScript
- Kibana查詢耗時
- 樹 耗時 計算 圖
- mPDF:當表格中的字串太長時,文字字型變小字串
- 資料庫,主鍵為何不宜太長長長長長長長長?資料庫
- 解決線上Oracle連線耗時過長的問題現象RPYBOracle
- Linux關機時間太長的調查和解決的方法Linux
- Android 快速定位耗時方法Android
- iOS 定時器耗電探究iOS定時器
- 使用bcc分析函式耗時函式
- 大表建索引,rman備份等耗費的時間通常比較長?還有多長時間才能執行完?索引
- 耗時6小時的同花順面試面試
- 邦芒面試:待業時間太長會影響面試成功機率嗎?面試
- banq求助servlet out.println()的內容太多...執行時間太長..Servlet
- 模組化日常:耗時的釋出
- 配對程式設計——耗時加倍程式設計
- 統計lcp各部分耗時
- Ice works操作教程
- ICE原始碼研究原始碼
- excel檔案太長怎麼列印?Excel
- PHP中介軟體ICE,ICE的安裝配置,ICE常見編譯和執行(異常)錯誤PHP編譯
- ubuntu域名解析暫時失效解決辦法Ubuntu
- 非同步任務處理系統,如何解決業務長耗時、高併發難題?非同步
- 匯出處理耗時的檔案
- 實時獲取最耗CPU的SQLSQL
- Ice中Monitor的使用
- 《ZeroC Ice權威指南》
- D. Ice Cream Balls
- 如何刪除檔名太長的檔案 Win10電腦檔名太長無法刪除Win10
- PHP執行耗時指令碼實時輸出內容PHP指令碼
- 域名解析
- RedisTemplate使用不當引起服務耗時激增Redis