TCP 数据记录超时对我不起作用
TCP data rec timeout don't work for me
我有一个boost异步tcp客户端,它需要一直从服务器接收数据。我想留出一段时间,当没有保存数据n秒时,从服务器断开连接,然后再次尝试连接。我用的是vc++。
void tcpclient::Connect(){
.....
socket_.async_connect(*iterator,boost::bind(&tcpclient::AfterConnection,shared_from_this(),boost::asio::placeholders::error));
}
void tcpclient::AfterConnection(const boost::system::error_code& error){
if (!error)
{
SetTimeout();
}
}
void tcpclient::SetTimeout(int sec = 1)
{
SOCKET native_sock = socket_.native();
int result = SOCKET_ERROR;
if (INVALID_SOCKET != native_sock)
{
struct timeval tv;
tv.tv_sec = sec;
tv.tv_usec = 0;
result = setsockopt(native_sock, SOL_SOCKET, SO_RCVTIMEO,(char *)&tv,sizeof(struct timeval));
i = GetLastError();
}
}
我读起来像吹一样:
socket_.async_receive(boost::asio::buffer(buffer, 1024),
boost::bind(&tcpClient::handleReceive,
shared_from_this(),
boost::asio::placeholders::error,
buffer,
boost::asio::placeholders::bytes_transferred)
);
但当我试图模拟不存在数据连接的情况时,请继续发布:
$netstat-ao
TCP 192.168.0.6:62836 192.168.0.5:telnet ESTABLISHED 2840
发生这种事的原因是什么?
设置SO_RCVTIMEO
会导致对read
的阻塞调用在等待指定时间后返回,而没有数据,就像非阻塞套接字会立即返回一样。
所以,问题是,当read
返回EWOULDBLOCK错误时,你或Boost会怎么做?你需要展示你是如何阅读的;如果Boost在事件循环中处理它(基于select
或poll
),它可能只是等待一些数据变得可用。
如果是这种情况,一种更好的方法是向事件循环注册一个计时器回调,以每隔一秒或每隔一秒触发一次,并检查您是否在前一秒收到了一些数据。套接字选项对此没有帮助。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- setSockopt在C 中不起作用(超时设置为1s,等待更长的时间)
- libCurl 上传数据不活动超时不起作用
- TCP 数据记录超时对我不起作用