久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

如何在斷開連接后干凈地重新連接 boost::socket?

How do I cleanly reconnect a boost::socket following a disconnect?(如何在斷開連接后干凈地重新連接 boost::socket?)
本文介紹了如何在斷開連接后干凈地重新連接 boost::socket?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我的客戶端應用程序使用 boost::asio::ip::tcp::socket 連接到遠程服務器.如果應用失去與該服務器的連接(例如,由于服務器崩潰或關閉),我希望它定期嘗試重新連接,直到成功.

My client application uses a boost::asio::ip::tcp::socket to connect to a remote server. If the app loses connection to this server (e.g. due to the server crashing or being shutdown) I would like it to attempt a re-connect at regular intervals until it succeeds.

我需要在客戶端做什么才能干凈地處理斷開連接、整理然后反復嘗試重新連接?

目前我的代碼中有趣的部分看起來像這樣.

Currently the interesting bits of my code look something like this.

connect是這樣的:

bool MyClient::myconnect()
{
    bool isConnected = false;

    // Attempt connection
    socket.connect(server_endpoint, errorcode);

    if (errorcode)
    {
        cerr << "Connection failed: " << errorcode.message() << endl;
        mydisconnect();
    }
    else
    {
        isConnected = true;

        // Connected so setup async read for an incoming message.
        startReadMessage();

        // And start the io_service_thread
        io_service_thread = new boost::thread(
            boost::bind(&MyClient::runIOService, this, boost::ref(io_service)));
    }
    return (isConnected)
}

runIOServer() 方法只是:

void MyClient::runIOService(boost::asio::io_service& io_service)
{
    size_t executedCount = io_service.run();
    cout << "io_service: " << executedCount << " handlers executed." << endl;
    io_service.reset();
}

如果任何異步讀取處理程序返回錯誤,則它們只需調用此 disconnect 方法:

And if any of the async read handlers return an error then they just call this disconnect method:

void MyClient::mydisconnect(void)
{
    boost::system::error_code errorcode;

    if (socket.is_open())
    {
        // Boost documentation recommends calling shutdown first
        // for "graceful" closing of socket.
        socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, errorcode);
        if (errorcode)
        {
            cerr << "socket.shutdown error: " << errorcode.message() << endl;
        }

        socket.close(errorcode);
        if (errorcode)
        {
            cerr << "socket.close error: " << errorcode.message() << endl;
        }    

        // Notify the observer we have disconnected
        myObserver->disconnected();            
    }

..它嘗試正常斷開連接,然后通知觀察者,觀察者將開始每隔五秒調用 connect() 直到重新連接.

..which attempts to gracefully disconnect and then notifies an observer, which will start calling connect() at five second intervals until it gets reconnected.

還有什么我需要做的嗎?

目前這似乎有效.如果我殺死它所連接的服務器,我會在讀取處理程序中收到預期的 "End of file" 錯誤,并且 mydisconnect() 被調用而沒有任何問題.

Currently this does seem to work. If I kill the server that it is connected to I get the expected "End of file" error at my read handlers and mydisconnect() is called without any issues.

但是當它嘗試重新連接并失敗時,我看到它報告socket.shutdown error: Invalid argument".這僅僅是因為我試圖關閉一個沒有掛起讀/寫的套接字嗎?或者還有什么?

But when it then attempts to re-connect and fails I see it report "socket.shutdown error: Invalid argument". Is this just because I am attempting to shutdown a socket that has no read/writes pending on it? Or is it something more?

推薦答案

每次重新連接時都需要創(chuàng)建一個新的 boost::asio::ip::tcp::socket.最簡單的方法可能是使用 boost::shared_ptr 在堆上分配套接字(如果你的套接字完全封裝在一個類中).例如:

You need to create a new boost::asio::ip::tcp::socket each time you reconnect. The easiest way to do this is probably to just allocate the socket on the heap using a boost::shared_ptr (you could probably also get away with scoped_ptr if your socket is entirely encapsulated within a class). E.g.:

bool MyClient::myconnect()
{
    bool isConnected = false;

    // Attempt connection
    // socket is of type boost::shared_ptr<boost::asio::ip::tcp::socket>
    socket.reset(new boost::asio::ip::tcp::socket(...));
    socket->connect(server_endpoint, errorcode);
    // ...
}

然后,當 mydisconnect 被調用時,你可以釋放套接字:

Then, when mydisconnect is called, you could deallocate the socket:

void MyClient::mydisconnect(void)
{
    // ...
    // deallocate socket.  will close any open descriptors
    socket.reset();
}

您看到的錯誤可能是操作系統(tǒng)在您調用 close 后清理文件描述符的結果.當您調用 close 然后嘗試在同一個套接字上 connect 時,您可能正在嘗試連接無效的文件描述符.此時,根據(jù)您的邏輯,您應該會看到一條以Connection failed: ..."開頭的錯誤消息,但您隨后調用了 mydisconnect,這可能是在嘗試調用 shutdown> 在無效的文件描述符上.惡性循環(huán)!

The error you're seeing is probably a result of the OS cleaning up the file descriptor after you've called close. When you call close and then try to connect on the same socket, you're probably trying to connect an invalid file descriptor. At this point you should see an error message starting with "Connection failed: ..." based on your logic, but you then call mydisconnect which is probably then attempting to call shutdown on an invalid file descriptor. Vicious cycle!

這篇關于如何在斷開連接后干凈地重新連接 boost::socket?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權益,請聯(lián)系我們刪除處理,感謝您的支持!

相關文檔推薦

Assertion failed (size.widthgt;0 amp;amp; size.heightgt;0)(斷言失敗(size.width0 amp;amp; size.height0))
Rotate an image in C++ without using OpenCV functions(在 C++ 中旋轉圖像而不使用 OpenCV 函數(shù))
OpenCV: process every frame(OpenCV:處理每一幀)
Why can#39;t I open avi video in openCV?(為什么我不能在 openCV 中打開 avi 視頻?)
OpenCV unable to set up SVM Parameters(OpenCV 無法設置 SVM 參數(shù))
Convert a single color with cvtColor(使用 cvtColor 轉換單一顏色)
主站蜘蛛池模板: 久久久精品网站 | 国产91在线播放 | 日本成人区| 国产特级毛片aaaaaa | 免费影视在线观看 | 日韩一级黄色毛片 | 国产欧美精品一区二区 | 亚洲一区二区三区免费在线观看 | 久久久久久国产精品免费 | 黄频视频 | 国产精品毛片在线 | 午夜免费精品视频 | 欧美精品三区 | 毛片一级片 | 日本免费视频 | 亚洲精品99999 | 国产分类视频 | 天天草夜夜骑 | 99亚洲视频 | 国产视频线观看永久免费 | 国产精品久久久久久吹潮 | 国产精品一区二区三区在线 | 国产精品免费在线 | 6996成人影院网在线播放 | 国产成人一区二 | 91精品国产综合久久久亚洲 | 国产情侣啪啪 | av影音| 国产精品免费视频一区 | 美女日皮网站 | 欧美精品一区免费 | 亚洲网站在线播放 | 亚洲狠狠丁香婷婷综合久久久 | 欧美成人一区二区 | 欧美日本在线 | 日韩爱爱网 | 日韩在线xx | 农夫在线精品视频免费观看 | 久久不卡日韩美女 | 99精品一区 | www国产亚洲精品久久网站 |