TCP数据记录超时不适用于我
我有一个提升的异步tcp客户端,需要从服务器接收数据的所有时间。 我想让那里有一段时间,当不提供n秒的数据从服务器断开连接并尝试连接时。 我使用vC++。TCP数据记录超时不适用于我
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)
);
,但是当我试图模仿不arive数据连接撑etablished情况:
$的netstat -ao
TCP 192.168.0.6:62836 192.168.0.5:telnet ESTABLISHED 2840
这是什么问题为什么t他的发生?
回答:
设置SO_RCVTIMEO
会导致以其他方式阻止对read
的调用,在等待指定时间后返回无数据,因为非阻塞套接字将立即执行。
因此,问题是,当read
返回EWOULDBLOCK错误时,您或Boost会做什么?你需要展示你如何阅读;如果Boost正在事件循环中处理它(基于select
或poll
),它可能只是等待一些数据可用。
如果是这种情况,更好的方法是使用事件循环注册一个定时器回调来触发每一秒或经常发生,并检查您是否在前一秒收到一些数据。套接字选项不会帮助你。
以上是 TCP数据记录超时不适用于我 的全部内容, 来源链接: utcz.com/qa/262370.html