D6中TWinsockStream的疑问(100分)

  • 主题发起人 主题发起人 tull
  • 开始时间 开始时间
T

tull

Unregistered / Unconfirmed
GUEST, unregistred user!
我在写一个 CLIENT端的winsocket程序时,发现以下问题,
我用的是D6中的Tclientsocket工作在 ctBlocking方式下,
用 TWinsocketStream实现数据的读取,

当我从服务器端读数据时,发现当服务器端的所有数据传完了,
但 TWinsocketStream.read方法一定要等到timeout时间后才返回,
这个timeout时间是在 TWinsocketstream.create(clientsocket.socket,timeout)中
传入的的,



以下代码取自D6中source/vcl下的scktComp.pas中,
代码:
function TWinSocketStream.Read(var Buffer; Count: Longint): Longint;
var
  Overlapped: TOverlapped;
  ErrorCode: Integer;
begin
  ...
    if FEvent.WaitFor(FTimeOut) <> wrSignaled then
      Result := 0
    else
    begin
      GetOverlappedResult(FSocket.SocketHandle, Overlapped, DWORD(Result), False);
      FEvent.ResetEvent;
    end;
...
end;
其中这句
代码:
    if FEvent.WaitFor(FTimeOut) <> wrSignaled then
      Result := 0
只有FEvent在timeout后,才会返回 result :=0,在我的程序中
代码:
         while  HTTPStream.Read(inBuffer, buffsize) <>0 do
          begin
            receiveddata := receiveddata + string(inBuffer);
            FillChar(inBuffer, buffsize, 0);
          end; //while
才会跳出while循环,看来要判断数据是否传输完毕,一定要人工检查receiveddata中的特征数据了

不知大家是如何处理这个问题的?
 
TheStream := TWinSocketStream.Create(form1.ClientSocket1.Socket, 25000);
sendpro(runno);//打包数据
xx := 100;
TheStream.Write(senddata, blockno);//发送数据
if TheStream.WaitForData(25000) then //设为25秒,但并不影响速度,我一般只在1秒内就完成了
xx := TheStream.read(receiverdata, xx);
sleep(50);
recvpro(receiverdata, xx);
    clientsocket1.Active:=false;
 
好像是如此,因为你在等啊,你要做一个结束包的判断才行,比较你收到最后几个字节是
你的结束字符,然后就结束
 
不好意思,来晚了
 
后退
顶部