不是socket高手不要来

dragon122 2001-06-20 08:07:00
我在做一个应用程序时遇到一个问题:
因为socket的Blocking方式会阻塞其他程序执行,所以我把TClientSocket封装在了一个线程中但是当遇到目标机器不能连接时,它会连接很长一段时间,而且还要阻塞其他程序执行(在98下,在2k下没有此问题)试图想把TclientSocket的工作方式改成NonBlocking但是在线程里面它好像收不到连接的onRead,OnConnected等事件。造成任何机器都连接不上,如果你时socket的高手,请您帮解决一下。
...全文
65 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
notemper2 2001-06-21
  • 打赏
  • 举报
回复
对不起,上例说的是 blocking 模式
notemper2 2001-06-21
  • 打赏
  • 举报
回复
NonBlocking 模式要通过线程写对 socket 进行处理,一般来说不大适合客户端开发,但也未尝不可,ClientSocket 就要在线程中创建了:

procedure TMyThread.Execute;
var
Buffer: array [0..BufferLength] of Char;
lenNeed: Integer;
lenRead: Integer;

FSocketStream: TWinSocketStream;
begin
while (not Terminated) and FClientSocket.Socket.Connected do
begin
try
FSocketStream := TWinSocketStream.Create( FClientSocket.Socket, 60000);
try
{ initialize the buffer }
FillChar(Buffer, BufferLength, 0);
{ give the client 60 seconds to start writing }

if FSocketStream.WaitForData(60000) then
begin
lenNeed := BufferLength;

lenRead := FSocketStream.Read(Buffer, lenNeed);

if lenRead = 0 then
begin
Self.ClientSocket.Close;
end else
begin
// ClientSocket.SendText( Buffer );
Buffer[lenRead+1] := #0;

// 处理接收的数据
end;

end else
Self.ClientSocket.Close;
finally
FSocketStream.Free;
end;
except
(*
if not(ExceptObject is EAbort) then
Synchronize(HandleThreadException);
*)
// HandleException;
end;
end;

end;
sandAhrow 2001-06-21
  • 打赏
  • 举报
回复
这个问题很简单!在Tclientsocket的onerror事件添加出错处理代码就行了,这种错误应该是
eeConnect类型错误!
dragon122 2001-06-20
  • 打赏
  • 举报
回复
我做了一个管理线程,用了一个timer但是怎么让已经启动的线程强制结束,如果用TerminateThread 好象不能让他停止连接
riverlove 2001-06-20
  • 打赏
  • 举报
回复
强烈关注!!!
darkay 2001-06-20
  • 打赏
  • 举报
回复
自己做一个超时的处理吧,使用timer

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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