Error reading from socket

hs2002 2002-08-26 11:38:27
我写了一个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;

...全文
502 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
hs2002 2002-08-26
  • 打赏
  • 举报
回复
也请解释一下下面的代码:本代码调用了上面的函数。
procedure TTransportThread.Execute;

procedure SynchronizeException;
var
SendException: TObject;
begin
SendException := AcquireExceptionObject;
if Assigned(FTransport) and (SendException is ESocketConnectionError) then
FTransport.Connected := False;
PostMessage(FParentHandle, THREAD_EXCEPTION, 0, Integer(Pointer(SendException)));
end;

var
msg: TMsg;
Data: IDataBlock;
Event: THandle;
Context: Integer;
begin
CoInitialize(nil);
try
PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);
ReleaseSemaphore(FSemaphore, 1, nil);
try
FTransport.Connected := True;
try
Event := FTransport.GetWaitEvent;
while not Terminated and FTransport.Connected do
try
case MsgWaitForMultipleObjects(1, Event, False, INFINITE, QS_ALLINPUT) of
WAIT_OBJECT_0:
begin
WSAResetEvent(Event);
Data := FTransport.Receive(False, 0);
if Assigned(Data) then
begin
Data._AddRef;
PostMessage(FParentHandle, THREAD_RECEIVEDSTREAM, 0, Integer(Pointer(Data)));
Data := nil;
end;
end;
WAIT_OBJECT_0 + 1:
begin
while PeekMessage(msg, 0, 0, 0, PM_REMOVE) do
begin
if (msg.hwnd = 0) then
case msg.message of
THREAD_SENDSTREAM:
begin
Data := IDataBlock(msg.lParam);
Data._Release;
Context := FTransport.Send(Data);
if msg.wParam = 1 then
begin
Data := FTransport.Receive(True, Context);
Data._AddRef;
PostMessage(FParentHandle, THREAD_RECEIVEDSTREAM, 0, Integer(Pointer(Data)));
Data := nil;
end else
PostMessage(FParentHandle, THREAD_SENDNOTIFY, 0, 0);
end;
THREAD_REPLACETRANSPORT:
begin
FTransport := ITransport(msg.lParam);
FTransport._Release;
end;
else
DispatchMessage(msg);
end
else
DispatchMessage(msg);
end;
end;
end;
except
SynchronizeException;
end;
finally
Data := nil;
FTransport.Connected := False;
end;
except
SynchronizeException;
end;
finally
FTransport := nil;
CoUninitialize();
end;
end;

5,392

社区成员

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

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