我在写一个相当简单的服务器,使用boost :: asio。boost :: asio全双工连接
你如何去建立的boost :: ASIO ASYNC_WRITE()和async_read_some()因为你所读,写独立的插座的情况下的方法呢?
大多数的增压实例具有其结合到结束调用任一ASYNC_WRITE()或async_read()而不是两者的处理程序的async_accept()调用。
我在写一个相当简单的服务器,使用boost :: asio。boost :: asio全双工连接
你如何去建立的boost :: ASIO ASYNC_WRITE()和async_read_some()因为你所读,写独立的插座的情况下的方法呢?
大多数的增压实例具有其结合到结束调用任一ASYNC_WRITE()或async_read()而不是两者的处理程序的async_accept()调用。
我开始只async_read_some()建立连接后直接。 在回调过程中,我处理收到的数据,然后再次启动async_read_some()。
对于写部分: 我马上打电话ASYNC_WRITE因为有写的第一个数据包。当写入一个数据包时,不能写入其他数据,因此我也使用队列来写入数据。
一些伪代码:
Connection::sendBytes(bytes)
{
if (!sendInProgress) {
socket->async_write_some(bytes, onMessageWritten);
sendInProgress = true;
}
else writeQueue.push_back(bytes);
}
Connection::onBytesWritten()
{
if (writeQueue.size() == 0) {
sendInProgress = false;
}
else {
// Here you can theoretically send all left data at once (using vectored IO) or only some of the data.
// Depending on data size performance will be different.
socket->async_write_some(writeQueue, onBytesWritten);
writeQueue.clear();
}
}
此外,您将需要一些错误处理,并取决于谁能够调用write方法也锁定。如果你只是在一个驱动io_service的单线程中编写调用,那么这会更容易,因为所有的读写操作都发生在同一个线程中(事件循环),并且你不会锁定。例如。如果你在你的onBytesReceived处理程序中调用sendBytes,就会出现这种情况。