2013-10-08 118 views
0

我在写一个相当简单的服务器,使用boost :: asio。boost :: asio全双工连接

你如何去建立的boost :: ASIO ASYNC_WRITE()和async_read_some()因为你所读,写独立的插座的情况下的方法呢?

大多数的增压实例具有其结合到结束调用任一ASYNC_WRITE()或async_read()而不是两者的处理程序的async_accept()调用。

回答

0

我开始只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,就会出现这种情况。