用SOCKET编程,如何检测到某个客户端的异常退出呢?(比如断电)(100分)

Z

zkf002

Unregistered / Unconfirmed
GUEST, unregistred user!
ClientSocket有一个Server属性,它可以在触发ONERROR事件时(比如服务端停电)报告
服务端连接不正确。ServerSocket有一个CientError事件,它应该可以在某个客户端发生
非正常关闭时触发。但用什么方法可以获得出错客户端的名字或IP呢?(在客户端登录时
,我已在服务端记下了每个登录的名字或IP)

各位,请具体点,我是一个SOCKET新手,在其它网站上别人让我定期向每个客户端发信息
,如果不成功则判错误,但如果进行呢?最好附代码。另外,怎么广播发送每位客户?
 
怎么没人回答呢?
我的问题其实很好理解,当客户端登录时,往服务端发一个IP地址或计算机名,服务端
定时向每个IP地址上的客户端发送信息,如果确认客户端收到信息,则证明它在线,否则
就证明它已退出程序了(类似于OICQ中的好友是否在线的检查)。此过程不能PING IP地址
的方法,因为那样只能证明客户机是否开机而不能证明它是否用客户端程序。如何做?
请各位发送具体代码!
 
刚才看了一些以前的答案,发现不用定时发送信息也能完成我的功能,可以用ServerSocket
的CientError事件,如何具体进行呢?
 
在clienterror事件中添加
字符串:=socket.remoteaddress;
字符串2:=socket.remotehost;
 
xuyingfeng:
我加了,但我将某个客户端冷启动了,好像毫无反应
 
你在ServerSocketClientError中
用showmessage(socket.remoteaddress)试试看,没理由不行的。
 
也许要定义个timeout吧
 
添加一个通道检测保文,定时发送
 
向客户广播发送可以这样:
可以用intTotalClient记录客户数
For i:=0 TO intTotalClient-1 Do
ServerSocket1.Socket.connections.SendText(信息);
 
socket之间的非正常退出一般要有两个小时才能检测得到的:(
 
可以让客户端定期给服务器发送信息表明
在线,如果在一定时间内,服务器没收到
此信息,就可以认为客户端挂掉了。
 
客户端广播消息
服务器接收到,则给客户端发送成功信息
当然没有发送返回信息的服务器端就是没有正常连接的
用UDP比较合适
服务器端:(被控端)
procedure ondatareceived;
begin
if udp1.fromip='客户端的IP地址' then
udp1.sendtext('ok');
end;
客户端:(控制端)
procedure ontimer;
begin
udp1.remotehost:=服务器端地址;
udp1.remoteport:=客户端和服务器端共同约定的端口号
udp1.sendtext('test');
end;
procedure ondatareceived;
begin
if udp1.fromip='服务器端的IP地址' then
//该地址的服务器可用
end;
 
ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
与 ClientError()

没有理由收不到吧。
用 TCP协议是虚电路方式。
不过我还没有试过。因为我这里不能冷启别人的计算机。
 

Similar threads

顶部