因为机房需要,我用了盒子上的一个源码程序“远程控制自己来之自动上线”,把它的client端改成了服务程序Service Application,上面放了个ClientSocket和timer控件,主要代码没改
procedure TClient.Timer1Timer(Sender: TObject);
{
发送连接请求
}
begin
C_Socket.Host:='192.168.1.3';
C_Socket.Port:=449;
C_Socket.Active:=True;
end;
procedure TClient.C_SocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
{
如果连接上,就发送IP信息、计算机名、操作系统及描述
info = 标志,便于接收端识别
}
Timer1.Enabled:=False;
C_Socket.Socket.SendText('info'+Getinfo());
end;procedure TClient.C_SocketDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Timer1.Enabled:=True; //连接断开时,自动发送连接请求
end;
server端还用原来的。运行时client可以正确的连接上server,没有什么问题。但是:因为我把这个client改成了服务程序,所以它一开机就会自动运行。当服务器没有运行server端的时候,客户端的服务程序client会一直向服务器发送连接信号。这样过一段时间就会导致客户机不能上网,用IE“工具中的网络诊断”,诊断的结果是: 
Windows检测到此计算机上的Winsock提供程序目录出现问题。此目录允许程序通过网络与此计算机通信。您希望Windows将目录重置为默认配置吗?这时候客户机停止client服务程序,就可以继续上网。我想出现这种问题,是不是这个client程序存在什么缺陷才导致它改动了Winsock提供程序目录?怎么改进?

解决方案 »

  1.   

    分两种情况:
    1.如果服务端没有开启,而客户端不断连接导致,客户端机器不能上网,那么应该是socket资源耗尽,应该可以通过netstat工具看到很多的socket资源没有被释放
    2.如果是服务端与客户端之间网络状态差,而导致类似问题的产生,同样也可以通过netstat看到很多非正常的连接.这个问题,还是跟程序有一定的关系.首先timer进行重连,应该在第一次设置Active为true一直到产生了ConnectError事件(OnError事件触发)之后才能进行下一次连接.当然也不能肯定你当前使用的ClientSocket控件本身是否存在问题.不清楚主要目的是什么,个人以为,应该可以通过使用Winsock API直接来完成功能,并且可控性也比较强.