場景
創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、日照網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5開發(fā)、商城網(wǎng)站建設、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為日照等各大城市提供網(wǎng)站開發(fā)制作服務。
boost庫中的asio模塊,在阻塞模式下,調(diào)用connect進行服務器的連接,如果服務器沒有打開,默認情況下需要20秒的超時連接,才會返回。目前嘗試設置套接字的連接超時時間,都不奏效。估計只能修改boost源碼中的超時時間
//設置成非阻塞,然后調(diào)用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));
分享文章:Boostasio同步連接超時設置失敗
網(wǎng)頁網(wǎng)址:http://muchs.cn/article24/gppjce.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設計、標簽優(yōu)化、關鍵詞優(yōu)化、網(wǎng)站營銷、虛擬主機、電子商務
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)