Vì vậy, tôi đã tạo một lớp socket sử dụng boost :: asio library để tạo và đọc không đồng bộ. Nó hoạt động, nhưng tôi có một vài câu hỏi.boost :: asio hoạt động và tài nguyên không đồng bộ
Dưới đây là một ví dụ mã cơ bản:
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;
};
Dường như chương trình sẽ đọc một gói, xử lý nó, sau đó chuẩn bị để đọc khác. Đơn giản. Nhưng nếu tôi thiết lập một nhóm luồng? Cuộc gọi tiếp theo có phải là doRead()
trước hoặc sau khi xử lý dữ liệu đã đọc không? Có vẻ như nếu nó được đặt trước do_something()
, chương trình có thể ngay lập tức bắt đầu đọc một gói khác, và nếu nó được đặt sau, chủ đề được gắn lên làm bất cứ điều gì do_something()
, có thể mất một thời gian. Nếu tôi đặt doRead()
trước khi xử lý, điều đó có nghĩa là dữ liệu trong m_readBuffer
có thể thay đổi trong khi tôi đang xử lý?
Ngoài ra, nếu tôi đang sử dụng async_send_to()
, tôi có nên sao chép dữ liệu được gửi vào bộ đệm tạm thời hay không, vì việc gửi thực sự có thể không xảy ra cho đến sau khi dữ liệu đã nằm ngoài phạm vi? tức là
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!
Ngoài ra, khi đóng socket, tay cầmRecv sẽ được gọi với lỗi cho biết nó bị gián đoạn. Nếu tôi làm
Socket* mySocket = new Socket()...
...
mySocket->close();
delete mySocket;
nó có thể gây ra lỗi, bởi vì có một cơ hội mà mySocket
sẽ bị xóa trước khi handleRecv()
được gọi/kết thúc?
+1 cho một câu hỏi hay, nhưng trong tương lai, tôi khuyên bạn nên tách nó thành các câu hỏi riêng biệt trên Stackoverflow. –