использовать функцию-член класса сокета или общую функцию в Boost :: asio? - PullRequest
0 голосов
/ 21 ноября 2018

Я изучаю Boost :: asio socket;Я видел примеры , где они используют функцию-член класса сокета для чтения и получения сообщений или используют общую функцию boost :: asio, которая передает сокет в качестве первого параметра.

Так что мне интересно, в чем разница между двумя подходами?спасибо!

//one kind
tcp::socket sock;
sock.async_write_some(***);

//another kind
boost::asio::async_write(socket,***);

1 Ответ

0 голосов
/ 21 ноября 2018

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] ошибок не было, вы знаете, что все данные были отправлены.

...