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中,
其中这句
只有FEvent在timeout后,才会返回 result :=0,在我的程序中
才会跳出while循环,看来要判断数据是否传输完毕,一定要人工检查receiveddata中的特征数据了
不知大家是如何处理这个问题的?
我用的是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
代码:
while HTTPStream.Read(inBuffer, buffsize) <>0 do
begin
receiveddata := receiveddata + string(inBuffer);
FillChar(inBuffer, buffsize, 0);
end; //while
不知大家是如何处理这个问题的?