нужен пример наддува: асинхронный сервер asio с приемником и акцептором - PullRequest
0 голосов
/ 04 сентября 2011

меня смотрели много хорошего примера, но я не нашел если кто-то может помочь, пожалуйста, помогите мне, это мой текущий класс

#include "StdAfx.h"
#include "TNetwork.h"
//-----------------------------------------------------------------------------------------------------------------------

CNetwork::CNetwork(io_service & io_service) : m_IoService(io_service), m_Acceptor(new ip::tcp::acceptor(io_service)) 
{
    m_AcceptMutex.initialize();
}
//-----------------------------------------------------------------------------------------------------------------------

void CNetwork::setConnector(void (*THISFUNC) (int))
{
    m_Connector = THISFUNC;
}
//-----------------------------------------------------------------------------------------------------------------------

void CNetwork::setReceiver(void (*THISFUNC) (int, u_char * , int))
{
    m_Receiver = THISFUNC;
}
//-----------------------------------------------------------------------------------------------------------------------

void CNetwork::setDisconnector(void (*THISFUNC) (int))
{
    m_Disconnector = THISFUNC;
}
//-----------------------------------------------------------------------------------------------------------------------

bool CNetwork::start(USHORT Port)
{
    DWORD dwStartTick = GetTickCount();
    // ----
    printf("[%s][Starting ...]\n", __FUNCTION__);
    // ----
    ip::tcp::endpoint selfpoint(ip::tcp::v4(), Port);
    // ----
    m_Acceptor->open(selfpoint.protocol());
    m_Socket = new ip::tcp::socket(m_IoService);
    // ----
    try
    {
        m_Acceptor->bind(selfpoint);
        m_Acceptor->listen();
    }
    catch(std::exception & e)
    {
        printf("[%s][%s]\n", __FUNCTION__, e.what());
        // ----
        return false;
    }
    // ----
    printf("[%s][Started OK , within %u milisecond(s)]\n", __FUNCTION__, (GetTickCount() - dwStartTick));
    // ----
    ip::tcp::socket * temp = new ip::tcp::socket(m_IoService); 
    m_Acceptor->async_accept( * temp, boost::bind(& CNetwork::acceptor, this, temp, boost::asio::placeholders::error));
    // ----
    return true;
}
//-----------------------------------------------------------------------------------------------------------------------

void CNetwork::acceptor(ip::tcp::socket * socket, const boost::system::error_code & error)
{
    if(error <= 0)
    {
        m_AcceptMutex.lock();
        // ----
        printf("[%s][New connection : %d.]\n", __FUNCTION__, m_Clients.size());
        m_Clients.push_back(socket);
        // ----
        if(m_Connector != NULL)
        {
            m_Connector(m_Clients.size());
        }
        // ----
        m_AcceptMutex.unlock();
        // ----
        //socket->async_receive(boost::asio::buffer(m_buffers), 
    }
    else
    {
        printf("[%s][%s]\n", __FUNCTION__, error.message());
    }
    // ----
    ip::tcp::socket * temp = new ip::tcp::socket(m_IoService); 
    // ----
    // ----
    m_Acceptor->async_accept( * temp, boost::bind(& CNetwork::acceptor, this, temp, boost::asio::placeholders::error));
}
//-----------------------------------------------------------------------------------------------------------------------

но я не знаю как получить и как я буду отправлять всем клиентам список

У кого-нибудь есть хороший пример, поделитесь им, или объясните мне, как продолжить мой урок я пытаюсь это использовать.

1 Ответ

1 голос
/ 04 сентября 2011

Я не знаю, как получить?

использовать функцию async_read () .

и как яотправит всем спискам клиентов?

перебирает ваш контейнер m_Clients и вызывает async_write () для каждого socket.


не имеет отношения, но не делайте этого

m_AcceptMutex.lock();
// ...
m_AcceptMutex.unlock();

Это может привести к ошибкам и не исключает исключений.Используйте RAII здесь, чтобы разблокировать мьютекс в деструкторе.Вы уже используете boost, поэтому используйте boost :: mutex :: scoped_lock .

...