社区
通信技术
帖子详情
[Socket]请问我如何检查自己的socket连接当前处于什么TCP状态呢?
zhengyun_ustc
2005-02-03 12:12:08
请问我如何检查自己的socket连接当前处于什么TCP状态呢?
因为我想如果检查到当前连接处于CLOSE_WAIT状态的话,就调用closesocket()函数。
是否是使用select+fd_isset来做到这一点呢?
Thanks!
...全文
493
7
打赏
收藏
[Socket]请问我如何检查自己的socket连接当前处于什么TCP状态呢?
请问我如何检查自己的socket连接当前处于什么TCP状态呢? 因为我想如果检查到当前连接处于CLOSE_WAIT状态的话,就调用closesocket()函数。 是否是使用select+fd_isset来做到这一点呢? Thanks!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
tccsdn
2005-02-04
打赏
举报
回复
学习
zhengyun_ustc
2005-02-03
打赏
举报
回复
回复人: flyinair2000() ( ) 信誉:100 2005-02-03 11:52:00 得分: 0
是否是使用select+fd_isset来做到这一点呢?
---
肯定不是。
因为我想如果检查到当前连接处于CLOSE_WAIT状态的话,就调用closesocket()函数。
--------
我印象中CLOSE_WAIT和调用closesocket没关系。你为什么要检测CLOSE_WAIT状态?奇怪的想法。
Top
回复人: xiaohaiyan(xiaohaiyan) ( ) 信誉:100 2005-02-03 12:15:00 得分: 0
如果是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结构地址。
Top
回复人: zhengyun_ustc(郑昀) ( ) 信誉:100 2005-02-03 12:42:00 得分: 0
因为如果我是客户端,当我给服务器端发送数据后,正准备recv接收响应时,服务器突然直接关闭session和socket,于是我这边立刻进入CLOSE_WAIT状态,并且始终处于这种状态;这是我的猜想,我可以通过检查send和recv的返回值,以找到这种错误。
但是为了以防万一,我想主动检查TCP状态。
我的OS是Windows。
Eddie005
2005-02-03
打赏
举报
回复
分多、顶之
DentistryDoctor
2005-02-03
打赏
举报
回复
void DumpTcpTable(PMIB_TCPTABLE pTcpTable)
{
char strState[MAX_STRLEN];
struct in_addr inadLocal, inadRemote;
DWORD dwRemotePort = 0;
char szLocalIp[MAX_STRLEN];
char szRemIp[MAX_STRLEN];
if (pTcpTable != NULL)
{
printf("TCP TABLE\n");
printf("%20s %10s %20s %10s %s\n", "Loc Addr", "Loc Port", "Rem Addr",
"Rem Port", "State");
for (UINT i = 0; i < pTcpTable->dwNumEntries; ++i)
{
switch (pTcpTable->table[i].dwState)
{
case MIB_TCP_STATE_CLOSED:
strcpy(strState, "CLOSED");
break;
case MIB_TCP_STATE_TIME_WAIT:
strcpy(strState, "TIME_WAIT");
break;
case MIB_TCP_STATE_LAST_ACK:
strcpy(strState, "LAST_ACK");
break;
case MIB_TCP_STATE_CLOSING:
strcpy(strState, "CLOSING");
break;
case MIB_TCP_STATE_CLOSE_WAIT:
strcpy(strState, "CLOSE_WAIT");
break;
case MIB_TCP_STATE_FIN_WAIT1:
strcpy(strState, "FIN_WAIT1");
break;
case MIB_TCP_STATE_ESTAB:
strcpy(strState, "ESTAB");
break;
case MIB_TCP_STATE_SYN_RCVD:
strcpy(strState, "SYN_RCVD");
break;
case MIB_TCP_STATE_SYN_SENT:
strcpy(strState, "SYN_SENT");
break;
case MIB_TCP_STATE_LISTEN:
strcpy(strState, "LISTEN");
break;
case MIB_TCP_STATE_DELETE_TCB:
strcpy(strState, "DELETE");
break;
default:
printf("Error: unknown state!\n");
break;
}
inadLocal.s_addr = pTcpTable->table[i].dwLocalAddr;
if (strcmp(strState, "LISTEN") != 0)
{
dwRemotePort = pTcpTable->table[i].dwRemotePort;
}
else
dwRemotePort = 0;
inadRemote.s_addr = pTcpTable->table[i].dwRemoteAddr;
strcpy(szLocalIp, inet_ntoa(inadLocal));
strcpy(szRemIp, inet_ntoa(inadRemote));
printf("%20s %10u %20s %10u %s\n",
szLocalIp, ntohs((unsigned short)(0x0000FFFF & pTcpTable->table[i].dwLocalPort)),
szRemIp, ntohs((unsigned short)(0x0000FFFF & dwRemotePort)),
strState);
}
}
}
DentistryDoctor
2005-02-03
打赏
举报
回复
请读一下PlatformSDK的示例
Samples\NetDS\IPHelp\IPStat
xiaohaiyan
2005-02-03
打赏
举报
回复
你查一下MSDN吧,肯定有接口函数的。netstat -a 可以看socket状态,调用的肯定就是这个接口。呵呵
xiaohaiyan
2005-02-03
打赏
举报
回复
如果是window,不太清楚。
Socket
编程例子
Socket
编程例子
TCP
Socket
与
TCP
连接
为建立
tcp
连接
所需要的
socket
给新建的
socket
绑定IP和port。 其中serv_addr结构体内包含了IP和port信息。 通过系统调用接收
连接
这里newsockfd是通过系统调用新建的
socket
文件描述符。当server监听到
连接
请求,便用这个新生产的
socket
与远程client的
socket
通讯。 server.c核心代码(多进程版,每个进程处理一个client的
连接
) 是一个多进程版本的
tcp
server,当有新的请求时,...
python
tcp
连接
状态
判断_
socket
连接
状态
判断方法
socket
非正常退出时,可以使用以下方法判断
socket
连接
状态
:特别说明:这种情况下,协议栈无法感知,SO_KEEPALIVE这个选项的超时事件太长并不实用,一般还是以应用层的heartbeat来及时发现。法一:当recv()返回值小于等于0时,
socket
连接
断开。但是还需要判断 errno是否等于 EINTR,如果errno == EINTR 则说明recv函数是由于程序接收到信号后返回的...
TCP
连接
的
状态
详解以及故障排查
我们通过了解
TCP
各个
状态
,可以排除和定位网络或系统故障时大有帮助。(总结网络上的内容) 1、
TCP
状态
了解
TCP
之前,先了解几个命令: linux查看
tcp
的
状态
命令: 1)、netstat -nat 查看
TCP
各个
状态
的数量 2)、lsof -i:port 可以检测到打开套接字的状况 3)、 sar -n SOCK 查看
tcp
创建的
连接
数 4)、
tcp
dump -iany...
socket
连接
和
TCP
的关系
tcp
连接
socket
连接
建立是基于
TCP
的
连接
建立过程。
TCP
的
连接
需要通过3次握手报文来完成,开始建立
TCP
连接
时需要发送同步SYN报文,然后等待确认报文SYN+ACK,最后再发送确认报文ACK。
TCP
连接
的关闭通过4次挥手来完成,主动关闭
TCP
连接
的一方发送FIN报文,等待对方的确认报文;被动关闭的一方也发送FIN报文,然等待确认报文。
Socket
连接
套接字底层是基于
TCP
的,所以
socket
的超时和
TCP
超时是相同的。 JAVA
Socket
连接
建立超时和
TCP
是相同的,如果
TCP
建立
连接
时
通信技术
4,387
社区成员
28,918
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章