Error reading from socket
我写了一个MIDAS程序。
在一个线程的execute中循环调用:
只调用了ClientDataSet1.Open;
ClientDataSet1.execute;
在客户端响应了AfterExecute,
在服务器端响应了BeforeExecute,AfterExecute
这三个事件响应函数只用到了OwnerData参数.
为什么运行一阵子之后便出现这样的错误,错误出在(26)(27)两行?如何解决?我都不知道什么时候会调用这个函数TSocketTransport.Receive
(1) function TSocketTransport.Receive(WaitForInput: Boolean; Context: Integer): IDataBlock;
(2) var
(3) RetLen, Sig, StreamLen: Integer;
(4) P: Pointer;
(5) FDSet: TFDSet;
(6) TimeVal: PTimeVal;
(7) RetVal: Integer;
(8) begin
(9) Result := nil;
(10) TimeVal := nil;
(11) FD_ZERO(FDSet);
(12) FD_SET(FSocket.SocketHandle, FDSet);
(13) if not WaitForInput then
(14) begin
(15) New(TimeVal);
(16) TimeVal.tv_sec := 0;
(17) TimeVal.tv_usec := 1;
(18) end;
(19) RetVal := select(0, @FDSet, nil, nil, TimeVal);
(20) if Assigned(TimeVal) then
(21) FreeMem(TimeVal);
(22) if RetVal = SOCKET_ERROR then
(23) raise ESocketConnectionError.Create(SysErrorMessage(WSAGetLastError));
(24) if (RetVal = 0) then Exit;
(25) RetLen := FSocket.ReceiveBuf(Sig, SizeOf(Sig));
(26) if RetLen <> SizeOf(Sig) then
(27) raise ESocketConnectionError.CreateRes(@SSocketReadError);
(28) if (Sig and CallSig <> CallSig) and
(29) (Sig and ResultSig <> ResultSig) then
(30) raise Exception.CreateRes(@SInvalidDataPacket);
(31) RetLen := FSocket.ReceiveBuf(StreamLen, SizeOf(StreamLen));
(32) if RetLen = 0 then
(33) raise ESocketConnectionError.CreateRes(@SSocketReadError);
(34) if RetLen <> SizeOf(StreamLen) then
(35) raise ESocketConnectionError.CreateRes(@SSocketReadError);
(36) Result := TDataBlock.Create as IDataBlock;
(37) Result.Size := StreamLen;
(38) Result.Signature := Sig;
(39) P := Result.Memory;
(40) Inc(Integer(P), Result.BytesReserved);
(41) while StreamLen > 0 do
(42) begin
(43) RetLen := FSocket.ReceiveBuf(P^, StreamLen);
(44) if RetLen = 0 then
(45) raise ESocketConnectionError.CreateRes(@SSocketReadError);
(46) if RetLen > 0 then
(47) begin
(48) Dec(StreamLen, RetLen);
(49) Inc(Integer(P), RetLen);
(50) end;
(51) end;
(52) if StreamLen <> 0 then
(53) raise ESocketConnectionError.CreateRes(@SInvalidDataPacket);
(54) InterceptIncoming(Result);
(55) end;