关于Socket服务器关闭再运行后,客户端重新连接的问题。
服务器端,可动态的创建多个线程,每个线程对应着一个客户端,每个线程又可以创建一个线程,用来接收和发送数据。
客户端,有一个线程,来接收数据。
接收数据的时候没有问题。但是服务器关闭后,再打开,客户端重新连接的时候,服务器接收函数,总是超时。而且服务器端线程数目一直在上涨。这是什么情况?
客户端重连代码:
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;