`
public0821
  • 浏览: 236266 次
  • 性别: 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,需要仔细研究下

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics