如果我客户端直接关闭程序,就会出现错误“Read error 64 指定的网络名不可再用”,我觉得是客户端SOCKET异常关闭后,服务端没有关闭SOCKET,而继续在该SOCKET上读写,但该怎么处理呢?procedure TMainform.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread := TClientThread.Create(False, ClientSocket);
end;
Procedure TClientThread.ClientExecute;
begin
while Not Terminated And ClientSocket.Connected Do
begin
Synchronize(HandleRecvClient); 处理收到的消息
end;
end; // 处理从前台发来的消息
Procedure TClientThread.HandleRecvClient;
var
i,j:integer;
ReceiveBuffer : BufferType;
SocketStream : TWinSocketStream;
BytesRead : Integer;begin
try
if not Assigned(SocketStream) then
begin
SocketStream := TWinSocketStream.Create(ClientSocket, 60000);
end;
FillChar(ReceiveBuffer, sizeof(ReceiveBuffer), 0); { initialize the buffer } { give the client 5 seconds to start writing }
If SocketStream.WaitForData(5000) Then
Repeat
BytesRead := SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));
if BytesRead > 0 then
begin
// ..................
// 处理接收到的数据
end
else
begin
{ if can't read in 6 seconds }
ClientSocket.Close; { close the connection }
end; // if BytesRead > 0
Until Not SocketStream.WaitForData(2000);
finally
SocketStream.Free;
end;
end;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread := TClientThread.Create(False, ClientSocket);
end;
Procedure TClientThread.ClientExecute;
begin
while Not Terminated And ClientSocket.Connected Do
begin
Synchronize(HandleRecvClient); 处理收到的消息
end;
end; // 处理从前台发来的消息
Procedure TClientThread.HandleRecvClient;
var
i,j:integer;
ReceiveBuffer : BufferType;
SocketStream : TWinSocketStream;
BytesRead : Integer;begin
try
if not Assigned(SocketStream) then
begin
SocketStream := TWinSocketStream.Create(ClientSocket, 60000);
end;
FillChar(ReceiveBuffer, sizeof(ReceiveBuffer), 0); { initialize the buffer } { give the client 5 seconds to start writing }
If SocketStream.WaitForData(5000) Then
Repeat
BytesRead := SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));
if BytesRead > 0 then
begin
// ..................
// 处理接收到的数据
end
else
begin
{ if can't read in 6 seconds }
ClientSocket.Close; { close the connection }
end; // if BytesRead > 0
Until Not SocketStream.WaitForData(2000);
finally
SocketStream.Free;
end;
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货