在Windows 7下的vs2008 Release(Win32)模式下编译后,这个程序(它已经从较大的程序缩小)总是崩溃.我不熟悉汇编代码,不知道它是编译器或boost :: ends_with的错误或者boost :: asio :: buffers_iterator.它可以在Ubuntu中使用g ++编译和执行,没有任何问题.
人们说它不太可能成为编译器的错误,但是当在调试模式(或禁用优化)中编译时,问题确实消失了.
我已经坚持这个问题了好几个小时.任何帮助表示赞赏.提前致谢.
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/algorithm/string.hpp>
typedef boost::asio::buffers_iterator<boost::asio::const_buffers_1> iterator_t;
typedef boost::iterator_range<iterator_t> range_t;
static const std::string LINE_END_MARK = "\r\n";
int main(int argc, char* argv[])
{
boost::asio::streambuf _buf;
std::ostream os(&_buf);
os<<"END\r\n";
iterator_t cursor = boost::asio::buffers_begin(_buf.data());
iterator_t end = boost::asio::buffers_end(_buf.data());
std::ostream_iterator<char> it(std::cout," ");
std::copy(LINE_END_MARK.begin(), LINE_END_MARK.end(), it);
range_t r(cursor, end);
if(!boost::ends_with(r, LINE_END_MARK))
return 0;
return 1;
}
Run Code Online (Sandbox Code Playgroud) 当我取消注释条件表达式时,程序将无法在visual c ++ 2008下编译.
#include <iostream>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
typedef boost::function<void(int, int)> vii_t;
typedef boost::function<void(int)> vi_t;
void foo(int a, int b){}
void bar(int a){}
int main(int argc, char* argv[])
{
//vi_t test= true ? boost::bind(foo, _1, 100) : boost::bind(bar, _1);
vi_t test1 = boost::bind(foo, _1, 100);
vi_t test2 = boost::bind(bar, _1);
//test(1);
test1(1);
test2(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud) TCP 有一个保持活动的机制来检测死连接,但让我惊讶的是这个选项在默认情况下是关闭的,而且许多库/工具没有使用这个功能。
如果我理解正确的话,如果来自对等方的所有 FIN/RST 数据包都丢失了,那么在 recv 调用中阻塞的 TCP 连接将无法检测到连接是否实际上已被对等方中止。
客户端的超时参数可能会缓解该问题,但许多库也没有设置超时的选项。一个例子是 mysql-python 连接器没有 recv timeout 选项。另一个例子是 Nginx 服务器使用 proxy_pass 与 gunicorn 后端通信,gunicorn 工作人员可能会由于其上的死连接而停止响应,但 gunicorn 工作人员无法检测到它。
如果我错了,任何人都可以解释原因或纠正我吗?