c++builder - 升级到 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;
}
解决方案
推荐阅读
- asp.net-core - 登录 Identity Server 4 - .Net Core 2.2
- c - 如何阅读这种格式
- sql - 如何增加保持字符串长度的最大值
- sql - 如果 X 但不是 Y,则 SQL 查询从表中返回所有内容
- c# - 我可以在收益返回方法中使用“使用”吗?
- node.js - 如何在 NodeJs、Express 和 JQuery 中生成 pdf 发票?
- php - 将函数参数传递给 ajax 数据返回未定义的索引错误
- php - laravel 警告和致命错误中要求打开失败
- python - __setitem__() 如何处理 4 个参数?
- java - 为 JLabel 设置背景图像后,如何在图像上显示文本?