async_write
как статическая функция гарантирует, что все данные в буфере будут записаны до того, как эта функция вернется.
async_write_some
как член функции гарантирует, что по крайней мере один байт будет записан из буфера до завершения этой функции.
Поэтому, если вы хотите использовать async_write_some
, вам нужно предоставить больше кода для обработки ситуации, когда не все данные из буфера были записаны.
Предположим, у вас есть строка с 10 байтами, это вашабуфер, и вы хотите убедиться, что весь буфер отправляется:
// Pseudocode:
string str;
// add 10 bytes to str
SIZE = 10;
int writtenBytes = 0;
socket.async_write_some (buffer(str.c_str(),SIZE), makeCallback());
void callback (
error_code ec,
size_t transferredBytes)
{
// check errors
// [1]
writtenBytes += transferredBytes;
if (writtenBytes == SIZE)
return;
// call async_write_some
socket.async_write_some (buffer(str.c_str()+writtenBytes,SIZE-writtenBytes),makeCallback());
}
при обратном вызове [1] вам нужно проверить, сколько байтов было записано, если результат отличается от SIZE
вынеобходимо повторно вызвать async_write_some
для отправки оставшейся части данных и т. д. Ваш обратный вызов может быть вызван много раз.
Использование async_write
проще:
string str; // add 10 bytes
async_write (buffer(str.c_str(),SIZE),makeCallback());
void callback() {
// check errors
[1]
}
, еслив [1]
ошибок не было, вы знаете, что все данные были отправлены.