Поскольку мы находимся на земле C ++, вы можете хранить данные в std :: vector
Новые данные добавляются в конец вектора. Когда вы получите уведомление о том, что сокет доступен для записи, попробуйте отправить полный вектор. send () вернет, сколько действительно было отправлено. Затем просто удалите это количество байтов из начала вектора:
std::vector<char> buffer;
...
if( ! buffer.empty() )
{
int bytesRead = send( socket, &buffer[ 0 ], buffer.size(), flags );
if( bytesRead > 0 )
buffer.erase( 0, bytesRead );
else
// some error...
}
Так что, возможно, нужно выполнить дополнительную проверку ошибок, но вы поняли идею?
Вместо того, чтобы ставить в очередь каждый отдельный запрос на отправку, преимущество в том, что вы можете потенциально объединить несколько отправок более высокого уровня в одну отправку через сокет, предполагая, что вы используете TCP?
Но, как справедливо заметил Ремус, управление потоком данных и API - это хитрый бит, то есть, как вы можете остановить слишком большой буфер?