重金请教TClientSocket的问题 ( 积分: 200 )

  • 主题发起人 主题发起人 songsheping
  • 开始时间 开始时间
S

songsheping

Unregistered / Unconfirmed
GUEST, unregistred user!
请各位高手指点我的问题:
我在作网络通信程序时Client端用的是Delphi6上的TClientSocket类,在实用过程中我发现了以下错误,当网络状况不好时此控件会返回“非法Socket对象操作”的错误(错误码:WSAENOTSOCK,在局域网下可自动恢复连接,但在GPRS上网的情况下就不能恢复连接),为此我在程序中动态创建此对象,若出现此错误则把Free后再Create,虽然解决了此问题但新的问题又有了,再多次Free再Create后,调用Open方法会有“Socket对象缓冲区已满”的错误提示后再也连接不上服务器了,请教各位了!
 
请各位高手指点我的问题:
我在作网络通信程序时Client端用的是Delphi6上的TClientSocket类,在实用过程中我发现了以下错误,当网络状况不好时此控件会返回“非法Socket对象操作”的错误(错误码:WSAENOTSOCK,在局域网下可自动恢复连接,但在GPRS上网的情况下就不能恢复连接),为此我在程序中动态创建此对象,若出现此错误则把Free后再Create,虽然解决了此问题但新的问题又有了,再多次Free再Create后,调用Open方法会有“Socket对象缓冲区已满”的错误提示后再也连接不上服务器了,请教各位了!
 
是不是没有完全释放呀,换成FreeAndNil(TClientSocket)试试
 
我Free时的代码如下:
try
ClientSocket.Close;
ClientSocket.Free;
ClientSocket := nil;
except
end;
这样是不是和你的FreeAndNil(TClientSocket)一样呀
 
tcp连接断开后,系统会保留socket/端口一段时间(可能几秒)
可以用 netstate 查看端口
 
你的代码中有问题,active:=True和active:=False;间隔太短,
 
我在程序中是每10秒检测一次ClientSocket连接的正确性的,当ClientSocket出错误时这时的连接是已断开的,需当我检测到错误需要Free时其实早断开了,也就是说Close是可以不用的;需d_eng老兄说的端口占用的问题,如果我Free后再连接时系统是不是会分配ClientSocket一个新的没有占用的端口?
 
是这样的.
socket连接时,会产生2个socket(server & client),
client port由系统生成;server port相对固定(一般就一个)
“Socket对象缓冲区已满”可能是server 给的
 
有道理,但有什么办法解决这个Server的问题呢?
 
遠程數據連接有沒有中斷?
 
另外,如果ClientSocket的对象已Free了那个Server应该是不会存在了吧。
 
clientsocket不正常断开的话,server socket是不会自动断开的,而这个seversocket就是个不想要的socket,如果这种无用的serversocket多了,就可能出现问题
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2575637
 
这个地址的问题我已看过了,对我没有什么帮助,且他自己解决的方法却是有问题的(我已给他回贴了)。
谢谢d_eng的热情帮助,从你的提示中我对TClientSocket又有了新的认识。
以前从网上看到网友们对这个控件的评价是“只能作个小的东东”如果不行的话,我就要用VC重做或在Unix下重作了。
再过几天,如果其他网友没有什么办法的我将分数分给大家了
 
我想改用INDY控件来重做。TClientSocket /TServerSocket真是有点问题。不能完全依靠它。
 
是的。我就使用的IdTcpClient
 
感谢大家的支持,见者有份了
 
^_^,我也遇到这样的问题,当时很头痛。后来我用阻塞式的idny来实现,一切OK。而且效率和稳定性很好。建议升级,我有源代码,可以交流。
 
后退
顶部