您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> Delphi >> TClientSocket 10053的问题

TClientSocket 10053的问题

来源:网络整理     时间:2016/9/1 10:23:52     关键词:

关于网友提出的“ TClientSocket 10053的问题”问题疑问,本网通过在网上对“ TClientSocket 10053的问题”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: TClientSocket 10053的问题
描述:

服务端是在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;

解决方案1:

那可能和tclientsocket无关了,而和变量的调用,定义等相关。
自己慢慢调试吧,闷头调试比这里解决问题快。

解决方案2:

几个建议:
1. 按目前的代码所实现的同步处理的原理, InitEpost和CallEPost这两个函数, 不能出现某个时刻同时被调用,或者某个函数被调用两次或以上。检查一下程序在这方面有没有什么问题。
2. 检查一下服务端的程序在处理同时的多个客户端连接时,是否有问题。
3. ErrorCode := 0; 这个语句还是要的, 后面再跟上 Socket.Close;


以上介绍了“ TClientSocket 10053的问题”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3697529.html

相关图片

相关文章