linux下有系统tcp连接超时时间么

linux下有系统tcp连接超时时间么,第1张

可以作为TCP连接的典范:

bool CRemoteLink::Connect()

{

OnDisconnected()   // 如果已经连接,则断开

if(!m_bUseProxy)

{

m_iConnStatus = SS_CONNECTING  // 正在连接状态

GNTRACE ("开始连接到远程服务器[%s][%ld]...\n", m_strip.c_str(), m_port)

// 建立套接字, 准备连接到服务器

m_socket = ::socket(AF_INET, SOCK_STREAM, 0)

if (socket < 0) {

if(m_pCallBack)

m_pCallBack->OnSocketError(SE_CREATE, MSG_SE_CREATE)

return false

}

// 设为异步 *** 作方式

unsigned long on = 1

if (::ioctlsocket(m_socket, FIONBIO, &on) < 0) {

::closesocket(m_socket)

if(m_pCallBack)

m_pCallBack->OnSocketError(SE_CREATE, MSG_SE_CREATE)

return false

}

sockaddr_in addr

memset(&addr, 0, sizeof(addr))

addr.sin_family = AF_INET

addr.sin_addr.s_addr = inet_addr(m_strip.c_str())

addr.sin_port = htons(m_port)

int rt

rt = ::connect(m_socket, (sockaddr *) &addr, sizeof(addr))

if (rt == 0) {

OnConnected()

return true

}

// ==================================================================

timeval to

// 首先建立连接

fd_set wfds

fd_set efds

FD_ZERO(&wfds)

FD_ZERO(&efds)

// test shutdown event each 100ms.

to.tv_sec = 0 

// CONNECT_TIMEOUT

to.tv_usec = 100000

int it = 0

while(!m_meShutdown.Wait(0) && !m_meConnStop.Wait(0))

{

FD_SET(m_socket, &wfds)

FD_SET(m_socket, &efds)

int n = select(m_socket + 1, NULL, &wfds, &efds, &to)

if (n > 0) {

if(FD_ISSET(m_socket, &wfds))

{

OnConnected()

return true

}

else

{

//int err = ::WSAGetLastError()

//const char*  msg = GetLastErrorMessage(err)

GNTRACE ("CRemoteLink::Connect : connection attempt failed!\n")

if(m_pCallBack)

m_pCallBack->OnSocketError(SE_CONN, MSG_SE_CONN)

break

}

} else if (n < 0) {  // Select Error

int err = ::WSAGetLastError()

const char*  msg = GetLastErrorMessage(err)

GNTRACE ("CRemoteLink::Connect : Select Error.[%d] - %s\n", err, msg)

if(m_pCallBack)

m_pCallBack->OnSocketError(err, msg)

break

}

else

{

it += 100

if(it > 30000)      // 连接超时 -- (30S)

{

GNTRACE ("CRemoteLink::Connect : Time out.\n")

if(m_pCallBack)

m_pCallBack->OnSocketError(SE_TIMEOUT, MSG_SE_TIMEOUT)

break

}

}

}

if(m_meConnStop.Wait(0))

{

GNTRACE("连接过程进行时被取消。\n")

}

}

else

{

// 通过代理服务器连接

收到心跳报文,更新你客户端链表中的m_time

/* 例如10妙发送一次 */

用户->m_time = (time_t)time(NULL)// time_t m_time

用一个独立线程检测是否超时

while (1) {

sleep(你定时检测心跳的时间)

time_t local_time = (time_t)time(NULL)

/*遍历你的现有用户*/

/* 例如 你的超时时间为40,那么就是你至少4次没收到心跳更新可以肯定需要断开连接了*/

if (( local_time - 用户->m_time) > 超时时间){

close (用户->sockfd)

}

}

还有疑问么?

不明白你说的老化时间,关于established的时间,摘录个别人的心得吧TCP协议有个超时重传机制,想必大家都比较熟悉。TCP协议是一种传输可靠的协议,因此这个机制是必不可少的。那么今天要探讨的是在发送队列还有数据的情况下,网络连接异常断开后,协议栈是到底是怎样来处理这些数据的,资源又是怎样被回收的呢?我这里先给出几个测试的结果:1、修改linux系统下的tcp_retries2为1,当socket发送队列有一定数据时,突然切断网线,造成异常断链的场景,此时,大约过了1秒,用netstat观察established的连接消失;2、继续把该参数修改为15,重复上面的实验,发现大约过了15分钟后,established的连接才断开;3、把参数再次修改为5,大约过了7秒,连接消失/proc/sys/net/ipv4/tcp_retries2 思考:TCP的超时后,重传的次数和重传的时间间隔是影响连接断开的主要参数。但是,从上面的实验数据来看,似乎没有什么规律。查阅linux帮助文档,发现这个重传的时间间隔与RTO有关,而这个参数又是协议栈通过检测网络状况而实时改变的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7278688.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存