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