社区
通信技术
帖子详情
[Socket]请问我如何检查自己的socket连接当前处于什么TCP状态呢?
zhengyun_ustc
2005-02-03 12:12:08
请问我如何检查自己的socket连接当前处于什么TCP状态呢?
因为我想如果检查到当前连接处于CLOSE_WAIT状态的话,就调用closesocket()函数。
是否是使用select+fd_isset来做到这一点呢?
Thanks!
...全文
470
7
打赏
收藏
[Socket]请问我如何检查自己的socket连接当前处于什么TCP状态呢?
请问我如何检查自己的socket连接当前处于什么TCP状态呢? 因为我想如果检查到当前连接处于CLOSE_WAIT状态的话,就调用closesocket()函数。 是否是使用select+fd_isset来做到这一点呢? Thanks!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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,不太清楚。
Python网络编程(
socket
)
答案就是
socket
.
socket
翻译为套接字,它本质就是在应用层和传输层(
TCP
/IP协议族通信)之间的一个抽象层,是一组接口,它把
TCP
/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。该课程包括OS...
TCP
Socket
与
TCP
连接
为建立
tcp
连接
所需要的
socket
给新建的
socket
绑定IP和port。 其中serv_addr结构体内包含了IP和port信息。 通过系统调用接收
连接
这里newsockfd是通过系统调用新建的
socket
文件描述符。当server监听到
连接
请求,便用这个新生产的
socket
与远程client的
socket
通讯。 server.c核心代码(多进程版,每个进程处理一个client的
连接
) 是一个多进程版本的
tcp
server,当有新的请求时,...
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
建立
连接
时
c语言判断
socket
状态
,
socket
怎的检测
TCP
连接
是否失效
socket
怎样检测
TCP
连接
是否失效?比如客户端,希望在定时器中不断检测
当前
连接
是否有效,如果检测无效后,重新执行
连接
,直到
连接
成功;若在一定时间内无法
连接
成功,退出程序。客户端
连接
的程序为voidClientConnect();intConnectFlag=0;检测
连接
是否有效的函数定义为void
Socket
Check();intCheckFlag=0;若定时器回调函...
TCP
socket
如何判断
连接
断开
1、
Socket
SO_KEEPALIVE不能取代心跳线程的原因 (1)SO_KEEPALIVE是系统底层的机制,用于系统维护每一个
tcp
连接
的。 (2)心跳线程属于应用层,主要用于终端和服务器
连接
的
检查
。 即使SO_KEEPALIVE检测到
连接
正常,但并不能保证终端和服务器
连接
的正常。有一种情况,服务器进程死了,但它和客户端的
tcp
连接
还连着(该
连接
由系统维护的)。 ...
通信技术
4,356
社区成员
28,926
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章