关于Socket服务器关闭再运行后,客户端重新连接的问题。

Coder_delphi 2012-04-10 08:41:04
服务器端,可动态的创建多个线程,每个线程对应着一个客户端,每个线程又可以创建一个线程,用来接收和发送数据。
客户端,有一个线程,来接收数据。
接收数据的时候没有问题。但是服务器关闭后,再打开,客户端重新连接的时候,服务器接收函数,总是超时。而且服务器端线程数目一直在上涨。这是什么情况?
客户端重连代码:
RecvCount := recv(FServerSocket, FCilentThread.FRecvInfo.ClientRecvData, FRecvLen, 0);
if RecvCount <= 0
begin//如果收到的数据包的长度不大于0,则重新与服务器连接
FCilentThread.FMemeryStream.Position := 0;
FReadPosition := 0;
LastSize := 0;
FCutSend.SendData[0] := $0F;
send(FServerSocket, FCutSend, 1, 0);//如果不是服务器关闭则向服务器发送此信息,使对应此客户端的线程结束。
StartSocket;
CreatSocket;
SocketConnect(StrToInt(Form1.edt1.Text), Form1.edt2.Text);
send(FServerSocket, FSendInfo, FActLen, 0);
end;
服务器接收代码:
nTimeOut := 1000;
while not Terminated do
begin
InActLen := SizeOf(FRecInfo);
If setsockopt(FHostSocket, SOL_SOCKET, SO_RCVTIMEO, Pchar(@nTimeOut), sizeof(Integer))<> SOCKET_ERROR then
begin
recv(FHostSocket, FRecInfo, InActLen, 0);
if FRecInfo.RecvData[0] = 0 then
begin
Continue;
end;
if FRecInfo.RecvData[0] = $0F then //客户端关闭时发送来的数据。
begin
closesocket(FHostSocket);
Break;
end;
OpenPackage(FRecInfo);
BiggerPackSend;
end;
Sleep(1000);
end;
...全文
2079 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hetulink 2012-08-04
  • 打赏
  • 举报
回复
河图中间件,定位是为各种智能设备与互联网的连接提供一个稳定的socket通道,可以根据需要为大家提供各种接口。

我们写了个中间件,就是帮大家实现大量的socket维持。 http://www.hetulink.com

欢迎交流 qq 1965-283-135
zj7676 2012-05-22
  • 打赏
  • 举报
回复
有必要这么麻烦吗? 开启服务器程序追踪一下就OK了
mhhaifeng 2012-05-10
  • 打赏
  • 举报
回复
服务端是不正常断开
我怀疑
客户端判断不出来,一直连着,一直向服务端发数据
而服务端缓冲区数据没清空,保持着各种状态信息,一直有数据,重新启动服务器的时候,与旧无效客户
连接重新连上了
客户端再次连接,可能发生冲突

shuihan20e 2012-05-10
  • 打赏
  • 举报
回复
你用的是阻塞模式吧,检查一下你的接受客户端连接的代码,也就是accept那块,你帖的这些代码里没有
hetulink 2012-05-10
  • 打赏
  • 举报
回复

看不懂你的程序。socket的确 很麻烦,用我的中间件吧,我设想就是给大家解决socket难题。 我的中间件里增加你的一个设备类型就行了。我们这个已经经受过上千个socket 2年的实际运行的代码,改写的。

河图中间件,定位是为各种智能设备与互联网的连接提供一个稳定的socket通道,可以根据需要为大家提供各种接口。 这是一个gprs打印机的智能接口。分布在物流中心、快餐厅厨房的gprs打印机24小时在线socket连接,随时接受各种打印请求。 打印发起者可以是网络上任何人,可以用http或者socket方式调用,并即时反馈打印是否成功。或者以其他方式对接大家的数据库
http://184.169.160.55/GPRS_Free_Test/
Coder_delphi 2012-04-10
  • 打赏
  • 举报
回复
我知道,为什么涨了,因为重连的时候服务器总是超时。给客户端返回不了东西。现在的问题是,为啥他会超时,我把超时时间设置为10000也不行呢
Coder_delphi 2012-04-10
  • 打赏
  • 举报
回复
上面的客户端代码,是写到线程里的,这个可以不断Connect直到服务器开了的
山东蓝鸟贵薪 2012-04-10
  • 打赏
  • 举报
回复
Socket服务器关闭了
客户端也会自动掉线的

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧