TClientSocket 10053疑问(100)

  • 主题发起人 主题发起人 boryce
  • 开始时间 开始时间
B

boryce

Unregistered / Unconfirmed
GUEST, unregistred user!
服务端是在AIX下的C程序 客户端利用DElphi的TClientSocket。 InitEpost的时候先获取目标端口,然后在CallEPost的时候利用目标端口建立新链接。 现在的情况是进行多次连续的InitEpost和CallEPost就会出现10053的错误。 且都有可能发生在上述两个函数中,在CSRead中收不到数据,已确认服务端已经发送了数据。 关闭了防火墙之类也同样出现10053.onError的时候置ErrorCode:=0,虽然不会跳出错误窗口,但是收不到数据,无法进行业务逻辑处理。 请求帮助....... procedure TPost.CSConnect(Sender: TObject; Socket: TCustomWinSocket);begin F_Status := ssOpen;end;procedure TPost.CSError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);begin //ErrorCode := 0; F_Status := ssError;end;procedure TPost.CSRead(Sender: TObject; Socket: TCustomWinSocket);var Str: String; //RecvLen: Integer;begin try if Socket.ReceiveLength > 0 then begin //F_LastRecv:= GetTickCount; F_Status := ssReading; Str := Socket.ReceiveText; SetData(Str);//对收到的报文处理,init的时候获取端口号,call的时候获取接收报文 end; except on E: Exception do begin //F_ProcInfo.SysLogs.WriteLog(ltError, '线程内发生错误,错误原因:' + E.Message); //F_ProcInfo.SysDiscard := True; end; end;end;function TPost.InitEPost: Boolean;var CSocket: TClientSocket; TickStart, TimeOut: cardinal;begin Result := False; try // 建立连接 CSocket := TClientSocket.Create(nil); F_Status := ssClose; //CSocket.Active := False; CSocket.Host := '192.168.1.50';//g_Ini.Tuxedo_IP; CSocket.Port := 8530;//g_Cfg.Ini.Tuxedo_Port; CSocket.ClientType := ctNonBlocking; CSocket.OnConnect := CSConnect; CSocket.OnError := CSError; CSocket.OnRead := CSRead; //CSocket.Active := True; CSocket.Open; // 等待连接成功 TickStart := GetTickCount; while F_Status = ssClose do begin Application.ProcessMessages; //Sleep(20); //等待连接超时设置 {if GetTickCount - TickStart > g_Ini.TimeOut then begin Result := False; Exit; end;} end; if F_Status = ssOpen then begin F_Status := ssSend; CSocket.Socket.SendText(g_Cfg.AddSpace(' ',64)); //SendMessage(CSocket.Socket,g_Cfg.AddSpace(' ',64),''); end; //TickStart := GetTickCount; while F_Status = ssSend do begin Application.ProcessMessages; //Sleep(20); //等待连接超时设置 {if GetTickCount - TickStart > g_Ini.TimeOut then begin Result := False; Exit; end;} end; //TickStart := GetTickCount; while F_Status = ssReading do begin Application.ProcessMessages; //Sleep(20); //等待连接超时设置 {if GetTickCount - TickStart > g_Ini.TimeOut then begin Result := False; Exit; end;} end; if F_Status = ssError then begin Result := False; Exit; end; Result := True; CSocket.Socket.Close; CSocket.Close; finally CSocket.Free; end;end;function TPost.CallEPost(Head, Body: String; Server: String; var RCode: Integer; var RStr: String): Boolean;var CSocket: TClientSocket; TickStart, TimeOut: cardinal;begin Result := False; Application.ProcessMessages; RCode := -1; try // 建立连接 CSocket := TClientSocket.Create(nil); F_Status := ssClose; //CSocket.Active := False; CSocket.Host := '192.168.1.50';//g_Ini.Tuxedo_IP; CSocket.Port := distPort; CSocket.ClientType := ctNonBlocking; CSocket.OnConnect := CSCOnnect; CSocket.OnError := CSError; CSocket.OnRead := CSRead; //CSocket.Active := True; CSocket.Open; // 等待连接成功 TickStart := GetTickCount; while F_Status = ssClose do begin Application.ProcessMessages; //Sleep(20); //等待连接超时设置 {if GetTickCount - TickStart > g_Ini.TimeOut then begin Result := False; Exit; end;} end; if F_Status = ssOpen then begin F_Status := ssSend; CSocket.Socket.SendText(Head+Body); //SendMessage(CSocket.Socket, Head, Body); end; TickStart := GetTickCount; while F_Status = ssSend do begin Application.ProcessMessages; //Sleep(20); //等待连接超时设置 {if GetTickCount - TickStart > g_Ini.TimeOut then begin Result := False; Exit; end;} end; TickStart := GetTickCount; while F_Status = ssReading do begin Application.ProcessMessages; //Sleep(20); //等待连接超时设置 {if GetTickCount - TickStart > g_Ini.TimeOut then begin Result := False; Exit; end;} end; if F_Status = ssError then begin Result := False; Exit; end; RCode := 0; RStr := F_RHead + F_RBody; Result := True; CSocket.Socket.Close; CSocket.Close; finally CSocket.Free; end;end;
 
没有人来吗
 
着急,请求帮忙了。。。。。。
 
LZ.冒昧说下.我第一眼看上去.就觉的你的基础不扎实.
 
所以才请求帮助了。。。呵呵
 
CSocket := TClientSocket.Create(nil);try .....finally FreeAndNil(CSocket);end;而你是这样写的.try CSocket := TClientSocket.Create(nil); .....finally CSocket.freeend;如果你创建对象不成功,那已经错了.又来强制的释放对象,那不是更错.你看看VCL的源码.
 
en,这个的确也是问题,但不是通讯上出的问题吧。
 
以前遇到过,是多次请求服务器连接造成的。当时是:服务器程序使用.Net编写,客户端使用Delphi编写.没有什么好办法。只能是自己控制好连接服务器和服务器处理数据的流程。
 
难道真没有解决办法了......郁闷。但是我直接把控件拖到窗体中使用,就不会报出错来,现在关键是不能这么做
 
这个情况确实有,简单的处理就是让软件初始化,或者重新启动。
 

Similar threads

I
回复
0
查看
257
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部