运行几小时后报错,不能在该机再建立SOCKET,不知问题出在哪里?请大侠们帮我会诊!服务端源码 // 处理从前台发来的消息
Procedure TClientThread.HandleRecvClient;
// var
// ...
begin
try
if not Assigned(SocketStream) then
begin
SocketStream := TWinSocketStream.Create(ClientSocket, 60000);
end;
FillChar(ReceiveBuffer, sizeof(ReceiveBuffer), 0); try
If SocketStream.WaitForData(5000) Then
Repeat
BytesRead := SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));
if BytesRead > 0 then
begin
; // ......
// 正常处理
end
else
begin
ClientSocket.Close;
break; // ?
end; // if BytesRead > 0
Until Not SocketStream.WaitForData(2000);
finally
SocketStream.Free;
// 客户端用非阻塞方式连接
// 在这里加 ClientSocket.Close;会导致客户端SOCKET中断
end;
except
ClientSocket.Close;
end;
end;Procedure TClientThread.ClientExecute;
begin
while Not Terminated And ClientSocket.Connected Do
begin
Synchronize(HandleRecvClient);
end;
ClientSocket.Close;
end;
Procedure TClientThread.HandleRecvClient;
// var
// ...
begin
try
if not Assigned(SocketStream) then
begin
SocketStream := TWinSocketStream.Create(ClientSocket, 60000);
end;
FillChar(ReceiveBuffer, sizeof(ReceiveBuffer), 0); try
If SocketStream.WaitForData(5000) Then
Repeat
BytesRead := SocketStream.Read(ReceiveBuffer,SizeOf(ReceiveBuffer));
if BytesRead > 0 then
begin
; // ......
// 正常处理
end
else
begin
ClientSocket.Close;
break; // ?
end; // if BytesRead > 0
Until Not SocketStream.WaitForData(2000);
finally
SocketStream.Free;
// 客户端用非阻塞方式连接
// 在这里加 ClientSocket.Close;会导致客户端SOCKET中断
end;
except
ClientSocket.Close;
end;
end;Procedure TClientThread.ClientExecute;
begin
while Not Terminated And ClientSocket.Connected Do
begin
Synchronize(HandleRecvClient);
end;
ClientSocket.Close;
end;
解决方案 »
- 新手求教
- 创建窗体的初级问题?
- 求助!急!!
- *****麻烦大家看看这个错误怎么解决!![Fatal Error] XMLUtils.pas(24): Read error on '.\output\Unicode.dcu'
- 动态生成控件,很急啊!大家救命!
- 用SendMessage发不出一些特殊字符?谁有办法?
- 请问如何获得一个文件的大小
- 怎么能将一个文件,(什么文件都可以的)内容放到memo内急呀。高分。在线等
- 请问是不是delphi5不能访问access2000?
- 超难度sql 语句
- BusinessSkinForm的动态换肤问题,请进来瞧瞧? 搞定,给100分!!
- QRDesign如何用、安装,谁有序列号?100分不够,可以另外在给!
Procedure TClientThread.HandleRecvClient;
var
SocketStream : TWinSocketStream;就在此过程中声明
如果声明为全局变量,那么每个线程都去用这个变量,更难以控制。
如果对症,可以再联系。
win32 api怎么做呀,哪里有介绍吗?
procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode := 0;
Socket.Close;
end;