`
public0821
  • 浏览: 238064 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ACE中UUID的问题

阅读更多

    最近用到了ACE的UUID,使用方法是网上找的,如下:

 

 

tstring sUuid;

ACE_Utils::UUID_GENERATOR::instance()->init();
ACE_Utils::UUID uuid;
ACE_Utils::UUID_GENERATOR::instance()->generateUUID(uuid);
sUuid.assign(uuid.to_string ()->c_str ())

return sUuid;

 

 

将这段代码封装成一个函数,在很多地方都用到了他,结果问题出来了,在linux环境中连接数据库的时候报系统资源不足,在windows环境跑着没有任何问题。

 

最开始的时候根本没怀疑到UUID上去,还以为是其他哪里的问题,当时看系统限制的进程打开文件句柄数是1024,通过跟踪程序,发现程序的socket句柄一直在涨,当时程序用到socket的地方只有发送UDP数据和连接数据库,于是使劲在那里面找,把人都快弄残废了。最后逐步排查,费了九牛二虎之力,才找到UUID上。

 

最后一看ACE的源代码,发现在ACE_Utils::UUID_GENERATOR::instance()->init();函数中打开了一个socket没有关闭,代码如下

 

 

#elif defined (linux)

  struct ifreq ifr;

  ACE_HANDLE handle =
    ACE_OS::socket (PF_INET, SOCK_DGRAM, 0);

  if (handle == ACE_INVALID_HANDLE)
    {
      return -1;
    }

  ACE_OS::strcpy (ifr.ifr_name, "eth0");

  if (ACE_OS::ioctl (handle/*s*/, SIOCGIFHWADDR, &ifr) < 0)
    {
      ACE_OS::close (handle);
      return -1;
    }

  struct sockaddr* sa =
    (struct sockaddr *) &ifr.ifr_addr;

  ACE_OS::memcpy (node->node,
		  sa->sa_data,
                  6);

  return 0;

#else

 

  里面的handle句柄在后面没有正常关闭。

 

 

由于我们用的是ACE5.4版本,于是我想看看最新的5.5.3版本是怎么样的,结果5.5.3版本的代码如下:

 

 

#elif defined (linux)

  struct ifreq ifr;

  ACE_HANDLE handle =
    ACE_OS::socket (PF_INET, SOCK_DGRAM, 0);

  if (handle == ACE_INVALID_HANDLE)
    return -1;

  ACE_OS::strcpy (ifr.ifr_name, "eth0");

  if (ACE_OS::ioctl (handle/*s*/, SIOCGIFHWADDR, &ifr) < 0)
    {
      ACE_OS::close (handle);
      return -1;
    }

  struct sockaddr* sa =
    (struct sockaddr *) &ifr.ifr_addr;

  ACE_OS::close (handle);

  ACE_OS::memcpy (node->node,
                  sa->sa_data,
                  6);

  return 0;

#else

  handle已经关闭了,估计是新版本修复了这个bug

 

 

由于不方便将ACE版本升级到最新版本,最后只能在自己的代码中控制只调用一次ACE_Utils::UUID_GENERATOR::instance()->init()函数,不知道这样后,生成的UUID还是不是真正的UUID,需要仔细研究下

 

分享到:
评论

相关推荐

    spring cloud实战项目

    Ace-Security是Spring Cloud实战项目中的一个关键组件,主要负责安全相关的配置和实现。这个模块通常包含了身份验证(Authentication)、授权(Authorization)以及其他的访问控制功能。通过Ace-Security,我们可以...

    ANCS Protocol.pdf

    3. Data Source:UUID为22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB,提供详细数据,当控制命令执行后,通过此特性返回结果。 在Notification Source发送的消息中,包含了EventID(消息类型,如添加、修改、删除)、...

    00VC++使用ADO实现BLOB二进制大对象数据的存取,VC++读写Access数据库

    conn-&gt;ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\MyDatabase.accdb;Persist Security Info=False;"; conn-&gt;Open(); ``` 在上述代码中,连接字符串指向了Access数据库文件的位置。 ...

    VC使用ADO方式打开任意路径access文件

    请注意,由于安全性和兼容性问题,现代版本的Access可能需要使用`Microsoft.ACE.OLEDB.12.0`提供程序,而不是`Microsoft.Jet.OLEDB.4.0`,特别是当处理ACCDB格式的数据库时。 总结,通过VC++使用ADO,我们可以轻松...

    VC中使用ADO连接数据库操作的一下心得体会

    // 如果使用的是Access 2000以上的版本,则Provider应该是“Microsoft.ACE.OLEDB.12.0”。 } catch (_com_error e) { // 处理异常... } ``` 这里需要注意的是,`Provider`属性指定了使用哪种数据库驱动程序,而`...

    MFC中使用ADO方法操作Access2013数据库

    conn-&gt;Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\MyDatabase.accdb", "", "", adConnectUnspecified); ``` 这里,“Provider”指定数据提供程序,"Data Source"是数据库文件路径,空字符串代表...

    vc通过ado读写access

    对于Access 2007及更高版本的.accdb文件,应使用`Provider=Microsoft.ACE.OLEDB.12.0`。 通过以上步骤,你可以在VC++中通过ADO有效地读写Access数据库。这种方式简洁且易于理解,适合处理简单的数据库操作。对于更...

    VC操作DBF数据库文件

    - 数据库连接字符串可能会根据数据库驱动的不同而变化,例如,这里使用的"Microsoft.Jet.OLEDB.4.0"驱动适用于较旧的DBF文件,新的可能是"Microsoft.ACE.OLEDB.12.0"。 - 为确保数据完整性和一致性,应该在事务中...

    Dialog_Update.rar_C++ list excel_文件更新

    conn-&gt;Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=myWorkbook.xlsx;Mode=ReadWrite;Extended Properties=\"Excel 12.0 Xml;HDR=YES\";", "", "", ADODB::adConnectUnspecified); ADODB::_RecordsetPtr ...

    VC下利用ADO连接Access数据库

    在Microsoft Visual C++ (VC) ...此外,根据Access数据库的版本和你的系统环境,可能需要使用不同的提供者(如`Microsoft.ACE.OLEDB.x.x`),以及相应的ODBC驱动程序。请确保你拥有正确的驱动和库,以避免连接问题。

    在VC中使用ADO操作数据库

    bstr_t strProvider = _T("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\mydatabase.accdb;"); conn-&gt;Open(strProvider, _T(""), _T(""), adModeUnknown); ``` #### 3. 执行SQL命令 通过`Command`对象或...

    VC++连接ACCESS数据库

    需要注意的是,不同的ACCESS版本可能需要不同的数据库提供者,如早期版本可能使用`Jet.OLEDB.4.0`,而较新的版本可能需要`ACE.OLEDB.12.0`。此外,还要确保数据库文件的权限设置正确,以允许程序进行读写操作。

    VC ADO方式连接数据库

    对于Access数据库,提供商通常是`Microsoft.Jet.OLEDB.4.0`或`Microsoft.ACE.OLEDB.12.0`(用于Access 2007及更高版本)。 然后,你可以创建一个`Command`对象,用以执行SQL语句。例如: ```cpp CComPtr...

    VC用ADO连接ACCESS数据库初级入门实例(会连者不必看)

    此外,注意随着版本更新,连接Access数据库可能需要更换提供者,例如使用`Microsoft.ACE.OLEDB.12.0`替代`Microsoft.Jet.OLEDB.4.0`来兼容Access 2007及更高版本的`.accdb`格式。 最后,对于初学者来说,理解ADO的...

    基于EXCEL的ACCESS数据库报表程序的实现

    随着信息技术的发展,特别是Microsoft Office组件如Excel的强大功能以及Visual C++(VC)这样的高级编程语言的应用,可以有效地解决这一问题。本文旨在介绍如何利用VC结合ActiveX Data Objects (ADO)技术访问...

    excel-ado.7z

    在实际应用中,还需要考虑错误处理、内存管理以及性能优化等问题。例如,使用批处理操作可以提高写入效率。另外,如果数据量较大,可能需要使用事务来确保数据的一致性。 总的来说,通过ADO和C++,我们可以灵活地对...

    VC++直接通过ADO操作Access数据库

    值得注意的是,不同版本的Access可能需要不同的数据提供者,例如,Access 2007及更高版本可能需要使用“Microsoft.ACE.OLEDB.12.0”而非“Microsoft.Jet.OLEDB.4.0”。 在实际开发中,你还需要处理异常和错误,确保...

    ado连接access

    对于Access数据库,通常使用`Microsoft.Jet.OLEDB.4.0`或`Microsoft.ACE.OLEDB.12.0`(取决于Access版本)作为提供者。 ##### 2. 创建记录集对象 连接数据库后,接下来需要创建记录集对象来存储查询结果。这通常在...

    CREATE_DB_AND_TABLE_add_edit_del-pw.rar_CREATE_DB_AND_TABLE_Tabl

    请注意,这里的"Provider=Microsoft.Jet.OLEDB.4.0"可能需要根据Access版本调整为"Microsoft.ACE.OLEDB.x.x"。 接下来,我们讨论如何对Access数据库进行密码保护。Access数据库支持设置用户级和数据库级密码。在...

    excel表格对帐程序

    Excel可以通过ODBC驱动(如Jet或ACE引擎)被视为数据库,允许VC++程序通过SQL查询来读写数据。 4. 数据操作步骤: - 创建Excel应用程序对象:通过`CoCreateInstance`函数实例化`_Application`接口。 - 打开或创建...

Global site tag (gtag.js) - Google Analytics