同步读写
812 字
4 分钟
同步读写
同步写write_some
boost::asio提供了几种同步写的api,write_some可以每次向指定的空间写入固定的字节数,如果写缓冲区满了,就只写一部分,返回写入的字节数。
void wirte_to_socket(asio::ip::tcp::socket& sock) { std::string buf = "Hello World!"; std::size_t total_bytes_written = 0; //循环发送 //write_some返回每次写入的字节数 //total_bytes_written是已经发送的字节数。 //每次发送buf.length()- total_bytes_written)字节数据
while (total_bytes_written != buf.length()) { total_bytes_written += sock.write_some( asio::buffer(buf.c_str()+total_bytes_written, buf.length()- total_bytes_written)); }}同步写send
write_some使用起来比较麻烦,需要多次调用,asio提供了send函数。send函数会一次性将buffer中的内容发送给对端,如果有部分字节因为发送缓冲区满无法发送,则阻塞等待,直到发送缓冲区可用,则继续发送完成。
int send_data_by_send(){ std::string raw_ip_address = "127.0.0.1"; unsigned short port_num = 3333;
try { asio::ip::tcp::endpoint ep(asio::ip::address::from_string(raw_ip_address), port_num);
asio::io_service ios;
// Step 1. Allocating and opening the socket. asio::ip::tcp::socket sock(ios, ep.protocol());
sock.connect(ep); std::string buf = "Hello World!"; int send_length = sock.send(asio::buffer(buf.c_str(), buf.length())); if (send_length <= 0) { cout << "send failed" << endl; return 0; } } catch (system::system_error& e) { std::cout << "Error occured! Error code = " << e.code() << ". Message: " << e.what();
return e.code().value(); } return 0;}同步写write
类似send方法,asio还提供了一个write函数,可以一次性将所有数据发送给对端,如果发送缓冲区满了则阻塞,直到发送缓冲区可用,将数据发送完成。
int send_data_by_wirte() { std::string raw_ip_address = "127.0.0.1"; unsigned short port_num = 3333;
try { asio::ip::tcp::endpoint ep(asio::ip::address::from_string(raw_ip_address), port_num);
asio::io_service ios;
// Step 1. Allocating and opening the socket. asio::ip::tcp::socket sock(ios, ep.protocol());
sock.connect(ep); std::string buf = "Hello World!"; int send_length = asio::write(sock, asio::buffer(buf.c_str(), buf.length())); if (send_length <= 0) { cout << "send failed" << endl; return 0; } } catch (system::system_error& e) { std::cout << "Error occured! Error code = " << e.code() << ". Message: " << e.what();
return e.code().value(); } return 0; }同步读read_some
同步读和同步写类似,提供了读取指定字节数的接口read_some
std::string read_from_socket(asio::ip::tcp::socket& sock) { const unsigned char MESSAGE_SIZE = 7; char buf[MESSAGE_SIZE]; std::size_t total_bytes_read = 0;
while (total_bytes_read != MESSAGE_SIZE) { total_bytes_read += sock.read_some( asio::buffer(buf + total_bytes_read, MESSAGE_SIZE - total_bytes_read)); }
return std::string(buf, total_bytes_read);}
int read_data_by_read_some() { std::string raw_ip_address = "127.0.0.1"; unsigned short port_num = 3333;
try { asio::ip::tcp::endpoint ep(asio::ip::address::from_string(raw_ip_address), port_num);
asio::io_service ios;
asio::ip::tcp::socket sock(ios, ep.protocol());
sock.connect(ep);
read_from_socket(sock); } catch (system::system_error& e) { std::cout << "Error occured! Error code = " << e.code() << ". Message: " << e.what();
return e.code().value(); }
return 0;}同步读receive
可以一次性同步接收对方发送的数据
int read_data_by_receive() { std::string raw_ip_address = "127.0.0.1"; unsigned short port_num = 3333;
try { asio::ip::tcp::endpoint ep(asio::ip::address::from_string(raw_ip_address), port_num);
asio::io_service ios;
asio::ip::tcp::socket sock(ios, ep.protocol());
sock.connect(ep); const unsigned char BUFF_SIZE = 7; char buffer_receive[BUFF_SIZE]; int receive_length = sock.receive(asio::buffer(buffer_receive, BUFF_SIZE)); if (receive_length <= 0) { cout << "receive failed" << endl; } } catch (system::system_error& e) { std::cout << "Error occured! Error code = " << e.code() << ". Message: " << e.what();
return e.code().value(); }
return 0;}同步读read
可以一次性同步读取对方发送的数据
int read_data_by_read() { std::string raw_ip_address = "127.0.0.1"; unsigned short port_num = 3333;
try { asio::ip::tcp::endpoint ep(asio::ip::address::from_string(raw_ip_address), port_num);
asio::io_service ios;
asio::ip::tcp::socket sock(ios, ep.protocol());
sock.connect(ep); const unsigned char BUFF_SIZE = 7; char buffer_receive[BUFF_SIZE]; int receive_length = asio::read(sock, asio::buffer(buffer_receive, BUFF_SIZE)); if (receive_length <= 0) { cout << "receive failed" << endl; } } catch (system::system_error& e) { std::cout << "Error occured! Error code = " << e.code() << ". Message: " << e.what();
return e.code().value(); }
return 0; }读取直到指定字符
我们可以一直读取,直到读取指定字符结束
std::string read_data_by_until(asio::ip::tcp::socket& sock) { asio::streambuf buf;
// Synchronously read data from the socket until // '\n' symbol is encountered. asio::read_until(sock, buf, '\n');
std::string message;
// Because buffer 'buf' may contain some other data // after '\n' symbol, we have to parse the buffer and // extract only symbols before the delimiter.
std::istream input_stream(&buf); std::getline(input_stream, message); return message; }文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章智能推荐
1
同步读写的服务器和客户端
boost2026-05-03
2
异步读写操作
boost2026-05-03
3
beast网络库实现websocket服务器
boost2026-05-17
4
beast网络库搭建http服务器
boost2026-05-16
5
asio实现http服务器
boost2026-05-15
随机文章随机推荐







