그래서 boost :: asio 라이브러리를 사용하여 비동기 읽기 및 쓰기를 수행하는 소켓 클래스를 만들었습니다. 작동하지만 몇 가지 질문이 있습니다.boost :: asio 비동기 작업 및 리소스
는 여기에 기본 코드 예제 :
class Socket
{
public:
void doRead()
{
m_sock->async_receive_from(boost::asio::buffer(m_recvBuffer), m_from, boost::bind(&Socket::handleRecv, this, boost::asio::placeholders::error(), boost::asio::placeholders::bytes_transferred()));
}
void handleRecv(boost::system::error_code e, int bytes)
{
if (e.value() || !bytes)
{
handle_error();
return;
}
//do something with data read
do_something(m_recvBuffer);
doRead(); //read another packet
}
protected:
boost::array<char, 1024> m_recvBuffer;
boost::asio::ip::udp::endpoint m_from;
};
프로그램이 다음 다른를 읽을 준비, 패킷을 읽어을 처리 할 것으로 보인다. 단순한. 하지만 스레드 풀을 설정하면 어떻게됩니까? 읽은 데이터를 처리하기 전이나 후에 doRead()
에 대한 다음 호출이 있어야합니까? do_something()
앞에 놓이면 프로그램은 즉시 다른 패킷을 읽을 수 있으며 나중에 넣으면 스레드가 묶여서 do_something()
이 무엇이든 할 수 있으며 이는 다소 시간이 걸릴 수 있습니다. 처리하기 전에 doRead()
을 넣으면 처리하는 동안 m_readBuffer
의 데이터가 변경 될 수 있습니다.
또한 async_send_to()
을 사용하는 경우 데이터가 범위를 벗어날 때까지 실제 송신이 이루어지지 않을 수도 있기 때문에 임시 버퍼로 보낼 데이터를 복사해야합니까? 즉
void send()
{
char data[] = {1, 2, 3, 4, 5};
m_sock->async_send_to(boost::buffer(&data[0], 5), someEndpoint, someHandler);
} //"data" gets deallocated, but the write might not have happened yet!
또한 소켓이 닫히면 handleRecv가 중단되었음을 나타내는 오류와 함께 호출됩니다. 호출되는 mySocket
이 handleRecv()
전에 삭제됩니다 기회가 있기 때문에 나는이 오류가 발생할 수
Socket* mySocket = new Socket()...
...
mySocket->close();
delete mySocket;
을 할 경우/완료?
+1 좋은 질문이지만, 미래에는 Stackoverflow에 대한 별도의 질문으로 나누는 것이 좋습니다. –