boost udp :: socket关闭,但不释放套接字UPDATE

时间:2016-05-24 14:35:44

标签: c++ boost visual-studio-2013 boost-asio

更新:如果我将async_receive_from更改为receive_from,则重新绑定不会有任何问题。不知怎的async...导致了这种情况。以前我为每个套接字都有一个线程(使用receive_from),但我必须让它在一个线程中工作,因为在程序运行期间会产生太多线程。

套接字已关闭(我已检查过),但重新绑定它会导致错误。这是一个例子:

#include "stdafx.h"
#include "Mmsystem.h"// for accurate timers
 #pragma comment (lib,"Winmm.lib")// for accurate timers
using namespace std;

typedef shared_ptr<boost::asio::ip::udp::socket> SHP_Socket;
boost::asio::io_service io_service_;
vector<int> ports;
vector<SHP_Socket> vecSock;
vector<boost::asio::ip::udp::endpoint> vecEndpoint;
vector<boost::shared_ptr<boost::thread>> receive_threads;
bool process_all_finishing;
uint8_t Data[8000];

void receive_h(boost::system::error_code ec, size_t szPack, int i)
{
    if (process_all_finishing == false)
    {
        cout << "\n" << i;
        string f = boost::to_string(Data);
        int sz = f.size();
        if (sz > 12)
        {
            vector<int> a;
            for (int i = 0; i < 100; ++i)
                a.push_back(i);
            a.clear();
        }
    }
}

void Run_io()
{
    while (process_all_finishing == false)
    {
        io_service_.run_one();
    }
    cout << "\nRun_io finished";
}

void receive()
{
    while (process_all_finishing == false)
    {
        this_thread::sleep_for(chrono::milliseconds(1));
        for (unsigned i = 0; i < vecSock.size(); ++i)
        {
            vecSock[i]->async_receive_from(boost::asio::buffer(Data, 8000), vecEndpoint[i], boost::bind(receive_h,_1,_2,i));
        }
    }   
    cout << "\nreceive finished";
}

int main()
{
    timeBeginPeriod(1);
    setlocale(LC_ALL, "Russian");
    try
    {
        ports.push_back(29005);
        ports.push_back(29007);
        ports.push_back(29009);
        ports.push_back(29001);

        vecSock.resize(3);
        vecEndpoint.resize(3);
        for (int i = 0; i < 3; ++i)
        {
            vecSock[i].reset(new boost::asio::ip::udp::socket(io_service_, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), ports[i])));
        }
        boost::shared_ptr<boost::thread> thread_re(new boost::thread(receive));
        boost::shared_ptr<boost::thread> thread_io(new boost::thread(Run_io));

        receive_threads.push_back(thread_re);
        receive_threads.push_back(thread_io);
        cout << "\nvecSock=3 created, giving it to work for 1 second:";

        this_thread::sleep_for(chrono::seconds(1));
        process_all_finishing = true;
        cout << "\nSent flag to stop threads and wait for threads to finish for 1 second";
        this_thread::sleep_for(chrono::seconds(1));
        for (int i = 0; i < vecSock.size(); ++i)
        {
            cout << "\nSocket " << i << " opened =\t" << vecSock[i]->is_open();
            vecSock[i]->cancel();
            vecSock[i]->close();
            cout << "\nSocket " << i << " counter =\t" << vecSock[i].use_count();
            cout << "\nSocket " << i << " opened =\t" << vecSock[i]->is_open();
            vecSock[i].reset();
            cout << "\nSocket " << i << " counter =\t" << vecSock[i].use_count();
            cout << "\n";

        }
        this_thread::sleep_for(chrono::seconds(1));
        vecSock.clear();
        vecSock.resize(4);
        vecEndpoint.resize(4);
        for (int i = 0; i < 4; ++i)
        {
            vecSock[i].reset(new boost::asio::ip::udp::socket(io_service_, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), ports[i])));
        }
        cout << "\nvecSock=4 created";
    }
    catch (boost::exception& e)
    {
        cerr <<"\n\a\a"<< boost::diagnostic_information(e);
        system("pause");
    }
    return 0;
}

这会导致绑定错误(exeption),我已使用try-catch重定向到控制台。

  

投掷位置未知(考虑使用BOOST_THROW_EXCEPTION)动态   异常类型:类boost :: exception_detail :: clone_impl&gt; std :: exception :: what:bind:通常是   只允许使用每个套接字地址(协议/网络)   地址/端口)

可以帮忙吗?我已经尝试了所有,我在参考文献c++boost中找到了什么,并没有任何帮助这个错误。

0 个答案:

没有答案