場景
成都創(chuàng)新互聯(lián)公司云計算的互聯(lián)網(wǎng)服務提供商,擁有超過13年的服務器租用、內江服務器托管、云服務器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗,已先后獲得國家工業(yè)和信息化部頒發(fā)的互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務許可證。專業(yè)提供云主機、虛擬主機、主機域名、VPS主機、云服務器、香港云服務器、免備案服務器等。boost庫中的asio模塊,在阻塞模式下,調用connect進行服務器的連接,如果服務器沒有打開,默認情況下需要20秒的超時連接,才會返回。目前嘗試設置套接字的連接超時時間,都不奏效。估計只能修改boost源碼中的超時時間
//設置成非阻塞,然后調用select等待超時,無效
int TestBoostAsioConnectTimeout()
{
boost::asio::io_service ios;
boost::asio::ip::tcp::socket sock(ios);
boost::system::error_code ec;
sock.open(boost::asio::ip::tcp::v4());
// 設為非阻塞
sock.io_control(boost::asio::ip::tcp::socket::non_blocking_io(true));
sock.connect(
boost::asio::ip::tcp::endpoint(
boost::asio::ip::address::from_string("192.168.1.1"), 80)
, ec);
fd_set fdWrite;
FD_ZERO(&fdWrite);
FD_SET(sock.native(), &fdWrite);
timeval tv = { 5 }; // 5秒超時
if (select(0, NULL, &fdWrite, NULL, &tv) <= 0
|| !FD_ISSET(sock.native(), &fdWrite))
{
std::cout << "連接超時" << std::endl;
sock.close();
return 0;
}
// 設回阻塞
sock.io_control(boost::asio::ip::tcp::socket::non_blocking_io(false));
std::cout << "連接成功" << std::endl;
sock.close();
return 0;
}
//獲取原始的套接字,進行屬性的設置
int TestBoostAsioConnectOverTime()
{
boost::asio::io_service ios;
boost::asio::ip::tcp::socket sock(ios);
boost::system::error_code ec;
sock.open(boost::asio::ip::tcp::v4());
// 設為非阻塞
sock.io_control(boost::asio::ip::tcp::socket::non_blocking_io(true));
int timeout = 3000;
int nRet = setsockopt(sock.native(), SOL_SOCKET, SO_CONNECT_TIME, (const char*)&timeout, sizeof(timeout));
nRet = setsockopt(sock.native(), SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout));
sock.connect(
boost::asio::ip::tcp::endpoint(
boost::asio::ip::address::from_string("192.168.1.1"), 80)
, ec);
fd_set fdWrite;
FD_ZERO(&fdWrite);
FD_SET(sock.native(), &fdWrite);
timeval tv;
tv.tv_sec = 1; // 5秒超時
tv.tv_usec = 0;
if (select(0, NULL, &fdWrite, NULL, &tv) <= 0
|| !FD_ISSET(sock.native(), &fdWrite))
{
std::cout << "超時/出錯啦" << std::endl;
sock.close();
return 0;
}
// 設回阻塞
sock.io_control(boost::asio::ip::tcp::socket::non_blocking_io(false));
std::cout << "連接成功" << std::endl;
sock.close();
return 0;
}
設置超時的代碼:
windows:
int nTvlen=1000; //1s
int retOpt=setsockopt(m_Socket,SOL_SOCKET, SO_RCVTIMEO, (const char*)&nTvlen,sizeof(nTvlen));
linux:
struct timeval nTvlen={1,0}; //1S
int retOpt=setsockopt(m_Socket,SOL_SOCKET, SO_RCVTIMEO, (const char*)&nTvlen,sizeof(nTvlen));
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。