[Socket]请问我如何检查自己的socket连接当前处于什么TCP状态呢?

zhengyun_ustc 2005-02-03 11:17:10
请问我如何检查自己的socket连接当前处于什么TCP状态呢?
因为我想如果检查到当前连接处于CLOSE_WAIT状态的话,就调用closesocket()函数。

是否是使用select+fd_isset来做到这一点呢?
Thanks!
...全文
403 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
halfdream 2005-02-04
  • 打赏
  • 举报
回复
CLOSE_WAIT不是非法关闭..这是一种正常过渡状态..
TCP连接双方,谁先主动调用了CLOSE来先断开连接(先进入半关闭状态),哪方就会进入CLOSE_WAIT状态.

其实需要留意的主要是SYN_SENT状态...

可以看看TCP状态变迁图.(出自于<TCP/IP详解>
http://tech.ccidnet.com/pub/attachment/2004/8/322250.gif
flyinair2000 2005-02-04
  • 打赏
  • 举报
回复
每次用的时候, check 一下send的返回值作一下判断就可以了。

不要用select!!
flyinair2000 2005-02-04
  • 打赏
  • 举报
回复
呵呵,偶就知道是这个原因。
我记得我过去是测试一下有没有发送成功,没有就重新开一个socket.(注意:这样的好处是不管有什么异常,你总可以发送成功。但要记得关闭原来的socket.否则,你会看到一大堆端口...)
bill_li 2005-02-04
  • 打赏
  • 举报
回复
查一下Win32书
zhengyun_ustc 2005-02-03
  • 打赏
  • 举报
回复
因为如果我是客户端,当我给服务器端发送数据后,正准备recv接收响应时,服务器突然直接关闭session和socket,于是我这边立刻进入CLOSE_WAIT状态,并且始终处于这种状态;这是我的猜想,我可以通过检查send和recv的返回值,以找到这种错误。
但是为了以防万一,我想主动检查TCP状态。
我的OS是Windows。
xiaohaiyan 2005-02-03
  • 打赏
  • 举报
回复
如果是linux系统,可以参考一下这个,
enum {
TCP_ESTABLISHED = 1,
TCP_SYN_SENT,
TCP_SYN_RECV,
TCP_FIN_WAIT1,
TCP_FIN_WAIT2,
TCP_TIME_WAIT,
TCP_CLOSE,
TCP_CLOSE_WAIT,
TCP_LAST_ACK,
TCP_LISTEN,
TCP_CLOSING, /* now a valid state */

TCP_MAX_STATES /* Leave at the end! */
};


socket->sock->sk_state 记录上述状态

调用getsockname ,可以通过fd得到socket结构地址。

flyinair2000 2005-02-03
  • 打赏
  • 举报
回复
是否是使用select+fd_isset来做到这一点呢?
---
肯定不是。

因为我想如果检查到当前连接处于CLOSE_WAIT状态的话,就调用closesocket()函数。
--------
我印象中CLOSE_WAIT和调用closesocket没关系。你为什么要检测CLOSE_WAIT状态?奇怪的想法。
kaphoon 2005-02-03
  • 打赏
  • 举报
回复
解决方案是用select测试socket是不是readable!

fd_set rset;
FD_ZERO(&rset);
while(1)
{
FD_SET(sockfd,&rset);
select(sockfd+1,rest,NULL,NULL,NULL);
if(FD_ISSET(sockfd,&rset)) read(sockfd,buf,sizeof buf);
}
kaphoon 2005-02-03
  • 打赏
  • 举报
回复
select是用于i/o多路复用,和tcp的状态没有什么关系。


于是我这边立刻进入CLOSE_WAIT状态,并且始终处于这种状态
》》》不是一直处于CLOSE_WAIT状态,结果是CLOSED。这个是正常关闭。
但是你说的应该是非法关闭,楼主可以参考Richard Steven的unix network
programing Vol1(edition 3ed)
5.12 Termination of Server Process
5.14 Crashing of Server Host
5.15 Crashing and Rebooting of Server Host
5.16 Shutdown of Server Host

to_be_or_not_to_be 2005-02-03
  • 打赏
  • 举报
回复
用select函数,可以返回socket当前状态

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧