首页 > 解决方案 > 升级到 C++Builder 11 后 TIdTCPServer 不工作

问题描述

以下代码在 C++Builder 10.3 Rio 中工作以通过网络流式传输文件。升级到 C++Builder 11 Alexandria 后,fileStreamerExecute()再也不会被调用。该文件确实在路径上创建,但长度为零并且正在使用中,因此任何打开文件的尝试都会失败。我猜 Indy 发生了一些变化,所以我的代码需要一些变化?

//---------------------------------------------------------------------------
void Tdata::stream_file(String path, Tstream_dir direction)
{
  _stream_path = path;
  _stream_dir = direction;
  if (_fs)
    delete _fs;
  if (_stream_dir == sdIn)
    _fs = new TFileStream(_stream_path, fmCreate | fmShareDenyNone);
  else
    _fs = new TFileStream(_stream_path, fmOpenRead | fmShareDenyNone);
  fileStreamer->DefaultPort = 9965;
  fileStreamer->Active = true;
}
//---------------------------------------------------------------------------
void __fastcall Tdata::fileStreamerExecute(TIdContext *AContext)
{
  if (_stream_dir == sdIn)
  {
    try
    {
      _fs->Position = 0;
      AContext->Connection->IOHandler->ReadStream(_fs, -1, true);
    }
    __finally
    {
        delete _fs;
        _fs = 0;
    }
    AContext->Connection->Disconnect();
  }
  else
  {
    try
    {
      AContext->Connection->IOHandler->Write(_fs);
    }
    __finally
    {
        delete _fs;
        _fs = 0;
    }
    AContext->Connection->Disconnect();
  }  
}

// ---------------------------------------------------------------------------
__fastcall TstartForm::TstartForm(TComponent* Owner) : TForm(Owner)
{
  char hostname[256];
  String host_ip = "";
  _progressForm = 0;
  if (gethostname(hostname, 256) == 0) {
    hostent *host = gethostbyname(hostname);
    if (host) {
      char *addr = host->h_addr;
      if (addr) {
        host_ip = String(inet_ntoa(*(in_addr*) addr));
        // returns "192.168.180.1" from VMWare network adaptor
        // hard code to correct value for testing
        host_ip = "192.168.1.226"; 
      }
    }
  }
}

编辑:更新以获取像这样的本地 IP,现在一切正常:

__fastcall TstartForm::TstartForm(TComponent* Owner) : TForm(Owner)
{
  _progressForm = 0;
  String host_ip = L"";
  TIdStackWindows* id_stack = new TIdStackWindows;
  if (id_stack) {
    host_ip = id_stack->LocalAddress;
    delete id_stack;
  }
}

编辑:更新以根据 Remy's Recommendation 获取本地 IP

__fastcall TstartForm::TstartForm(TComponent* Owner) : TForm(Owner)
{
  _progressForm = 0;
  String host_ip = L"";
  TIdStack::IncUsage();
  host_ip = GStack->LocalAddress;
  TIdStack::DecUsage();
  sm->_this_computer_id = host_ip;
}

标签: c++builderindy

解决方案


推荐阅读