修改提升::asio::socket::set_option
Modifying boost::asio::socket::set_option
我需要为连接到远程 TCP 服务器的boost::asio::ip::tcp::socket
设置选项boost::asio::ip::tcp::no_delay
和boost::asio::socket_base::linger
。我使用了set_option
的方法,以便毫无问题地实现这一目标。
问题:一旦io_service
run()
并打开socket
,如果要求我更改其选项(即:由于程序配置的更改),我可以在打开套接字的情况下进行操作吗?在更改选项之前是否需要关闭它?如果我不关闭它,它会在我脸上爆炸吗?这方面的最佳实践是什么?
我无法在文档中找到有关此的任何内容。
提前谢谢你。
我做了一些测试。
在set_option
或get_option
socket
之前,您必须open
它。否则,您会收到错误"提供的文件句柄无效"。
关闭socket
并再次打开后,所有选项"返回"为默认值。所以你需要每次set_option
后open
.我发现这样做的最佳位置是在传递给async_connect
的回调中。
调用async_connect
示例:
socketPtr->async_connect(endpoint_iter->endpoint(),
boost::bind(&ConnectCallback,
shared_from_this(),
boost::asio::placeholders::error));
回调定义:
void ConnectCallback(const boost::system::error_code& ec)
{
if (!ec)
{
// Set options here
boost::asio::socket_base::linger optionLinger(true, 0);
socketPtr->set_option(optionLinger);
boost::asio::ip::tcp::no_delay optionNoDelay(true);
socketPtr->set_option(optionNoDelay);
// Do what you must with the socket now, for instance async_read_some
socketPtr->async_read_some(boost::asio::buffer(buffer, BUFFER_LENGTH),
boost::bind(&ReadCallback,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
}
相关文章:
- 为什么我无法更改"set<set>"循环中的值<int>
- 对于set上的循环-获取next元素迭代器
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 如何使用set实现无序数据结构?
- 使用运算符调用 void 函数时出错<set>
- 修改"std::set"中用户定义类型的值
- 生成提升::hana::set 的常量表达式问题
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- set::find 查找不存在的元素
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- google test PrintTo for std::set<std::string>