ACE中UUID的問題

2021-08-25 07:18:03 字數 1840 閱讀 5028

最近用到了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)

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

if (ace_os::ioctl (handle/*s*/, siocgifhwaddr, &ifr) < 0)

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)

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,需要仔細研究下

ACE菜鳥的問題

我是個ace菜鳥,前一陣子頭痛於萬事開頭難的問題,很多問題相當sb,不過考慮到很多初學者和我一樣被老闆罵得焦頭爛額,這裡還是把學習 ace第一周遇到的問題貼上來,希望對剛剛接觸ace的鳥伴有所幫助 本貼討論的範圍 1 解決5.6版本的ace使用 ace has mfc 後提示win32 nt版本過低...

ACE的CDR中的位元組對齊問題

大家應該都知道計算機中間都有位元組對齊問題。cpu訪問記憶體的時候,如果從特定的位址開始訪問一般可以加快速度,比如在32位機器上,如果乙個32位的整數被放在能被32模除等於0的位址上,只需要訪問一次,而如果不在,可能要訪問兩次。但是這樣就要求一些資料從特定的位址開始,而不是順序排放 中間會有一些空餘...

ACE編譯問題

如果定義了巨集ace doesnt instantiate nonstatic object manager,就表明選擇了應用程式自己選擇初始化object manager物件,那麼只能為non static object manager了,需要在應用程式中手動呼叫ace init 和ace fin...