首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

怎么得到Tclientsocket的状态.加

2012-03-07 
如何得到Tclientsocket的状态.急急加急比如我的服务器端没有打开,先打开客户端程序,之后如何知道连接状态

如何得到Tclientsocket的状态.急急加急
比如我的服务器端没有打开,先打开客户端程序,之后如何知道连接状态
又怎样才能让客户端与服务器端重新建立连接.

[解决办法]
通过发送心跳报文进行检测,对于服务端,在服务端和客户端发送心跳报文,如果心跳收到,表明连接成功,如果没有收到,表明断开。
如果你是用的select,在连接掉线的时候:你在等待中,那么连接会属于读集合,同时,读取的返回值是0;如果正在读,就会在下一次读时,给你返回0;如果正在写,写的返回也会是0,在UNIX下还会产生管道消息。

select()函数
一但设置为阻塞模式,你就可以用select()函数去看看有没有“有用的数据”在socket。检测操作是否已经完成,从而释放设备或资源。其函数原形:
======================================
int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,const struct timeval *timeout);
======================================
nfds---这个参数常被忽略。
readfds---FD_SET指针
writefds--FD_SET指针
exceptfds--FD_SET指针
timeout---timeval指针


FD_SET结构
此结构用来检测数据是否“超出带宽”,一般用宏进行赋值:
FD_ZERO(*set)把set初始化为NULL
FD_CLR(s,*set)把set中的socket移除
FD_ISSET(s,*set)检测s是否set的一部分,如果真返回true.
FD_SET(s,*set)把socket添加至set.

比如你检测到socket可以安全写入数据,你可以使用FD_SET宏来设置writefds.

timeval结构:
原形:==================
struct timeval {
long tv_sec;
long tv_usec;
};
========================
tv_sec--是select()函数等待时间,单位秒
tv_usec--指出多少毫秒。单位毫秒
如果这两个都设置为0,则select()会快速返回。如果timeout=NULL,就不知道select什么情况下会返回。

select()的返回值。
如果超时则返回0.错误返回SOCKET_ERROR.还有一个可能就是返回事件号码。

readfds能识别以下情况:
1、有数据在接收队列
2、连接丢失、中断、重置
3、这个socket处于listen()模式,并有客户尝试连接。

writefds能识别以下情况:
1、有数据从socket上发送
2、有连接被服务器接受accept

exceptfds能识别以下情况:
1、一个连接已经从服务器上(连接)失败
2、“超出带宽”数据可以利用并被读取

热点排行