bool O2IMDB:: MakeSendXML(O2Profile *profile, const wchar_t *charset, const wchar_t *msg, string &out) { wstring xml; wstring tmpstr; wchar_t tmp[16]; if (profile->GetIP() == 0) return false; xml += L"<?xml version=\"1.0\" encoding=\""; xml += charset; xml += L"\"?>" EOL; xml += L"<messages>" EOL; xml += L"<message>" EOL; ip2e(profile->GetIP(), tmpstr); xml += L" <ip>"; xml += tmpstr; xml += L"</ip>" EOL; swprintf_s(tmp, 16, L"%d", profile->GetP2PPort()); xml += L" <port>"; xml += tmp; xml += L"</port>" EOL; hashT id; profile->GetID(id); id.to_string(tmpstr); xml += L" <id>"; xml += tmpstr; xml += L"</id>" EOL; wstring pubkey; profile->GetPubkeyW(pubkey); xml += L" <pubkey>"; xml += pubkey; xml += L"</pubkey>" EOL; xml += L" <name>"; xml += profile->GetNodeNameW(); xml += L"</name>" EOL; makeCDATA(msg, tmpstr); xml += L" <msg>"; xml += tmpstr; xml += L"</msg>" EOL; xml += L"</message>" EOL; xml += L"</messages>" EOL; FromUnicode(charset, xml, out); return true; }
bool O2Profile:: GetEncryptedProfile(string &out) const { if (!IP || !P2PPort) return false; string idstr; ID.to_string(idstr); string encipstr; ip2e(IP, encipstr); string encportstr; port2e(P2PPort, encportstr); out = idstr + encipstr + encportstr; return true; }
bool O2Profile:: ExportToXML(const O2ProfileSelectCondition cond, string &out) { wstring tmpstr; wchar_t tmp[32]; wstring xml; xml += L"<?xml version=\"1.0\" encoding=\""; xml += cond.charset; xml += L"\"?>" EOL; if (!cond.xsl.empty()) { xml += L"<?xml-stylesheet type=\"text/xsl\" href=\""; xml += cond.xsl; xml += L"\"?>" EOL; } xml += L"<"; xml += cond.rootelement; xml += L">" EOL; Lock(); //ID if (cond.mask & PROF_XMLELM_ID) { ID.to_string(tmpstr); xml += L" <ID>"; xml += tmpstr; xml += L"</ID>" EOL; } //IP if (cond.mask & PROF_XMLELM_IP) { ip2e(IP, tmpstr); xml += L" <IP>"; xml += tmpstr; xml += L"</IP>" EOL; } //NodeName if (cond.mask & PROF_XMLELM_NAME) { makeCDATA(NodeNameW, tmpstr); xml += L" <nodename>"; xml += tmpstr; xml += L"</nodename>" EOL; } //Comment if (cond.mask & PROF_XMLELM_COMMENT) { makeCDATA(Comment, tmpstr); xml += L" <comment>"; xml += tmpstr; xml += L"</comment>" EOL; } //P2PPort if (cond.mask & PROF_XMLELM_P2PPORT) { xml += L" <port>"; swprintf_s(tmp, 16, L"%d", P2PPort); xml += tmp; xml += L"</port>" EOL; } //ProxyPort if (cond.mask & PROF_XMLELM_PROXYPORT) { xml += L" <ProxyPort>"; swprintf_s(tmp, 16, L"%d", ProxyPort); xml += tmp; xml += L"</ProxyPort>" EOL; } //AdminPort if (cond.mask & PROF_XMLELM_ADMINPORT) { xml += L" <AdminPort>"; swprintf_s(tmp, 16, L"%d", AdminPort); xml += tmp; xml += L"</AdminPort>" EOL; } //PrivKey if (cond.mask & PROF_XMLELM_PRIVKEY) { PrivKey.to_string(tmpstr); xml += L" <PrivKey>"; xml += tmpstr; xml += L"</PrivKey>" EOL; } //PubKey if (cond.mask & PROF_XMLELM_PUBKEY) { PubKey.to_string(tmpstr); xml += L" <PubKey>"; xml += tmpstr; xml += L"</PubKey>" EOL; } //DBDir if (cond.mask & PROF_XMLELM_DBDIR) { makeCDATA(DBDirW, tmpstr); xml += L" <DBDir>"; xml += tmpstr; xml += L"</DBDir>" EOL; } //CacheRoot if (cond.mask & PROF_XMLELM_CACHEROOT) { makeCDATA(CacheRootW, tmpstr); xml += L" <CacheRoot>"; xml += tmpstr; xml += L"</CacheRoot>" EOL; } //AdminRoot if (cond.mask & PROF_XMLELM_ADMINROOT) { makeCDATA(AdminRootW, tmpstr); xml += L" <AdminRoot>"; xml += tmpstr; xml += L"</AdminRoot>" EOL; } //AdminBrowserType if (cond.mask & PROF_XMLELM_ADMIN_BROWSER_TYPE) { xml += L" <AdminBrowserType>"; xml += AdminBrowserType; xml += L"</AdminBrowserType>" EOL; } //AdminBrowserPath if (cond.mask & PROF_XMLELM_ADMIN_BROWSER_PATH) { makeCDATA(AdminBrowserPath, tmpstr); xml += L" <AdminBrowserPath>"; xml += tmpstr; xml += L"</AdminBrowserPath>" EOL; } //UPnPAdapterName if (cond.mask & PROF_XMLELM_UPNP_ADAPTERNAME) { ascii2unicode(UPnPAdapterName, tmpstr); makeCDATA(tmpstr, tmpstr); xml += L" <UPnPAdapterName>"; xml += tmpstr; xml += L"</UPnPAdapterName>" EOL; } //UPnPLocation if (cond.mask & PROF_XMLELM_UPNP_LOCATION) { ascii2unicode(UPnPLocation, tmpstr); makeCDATA(tmpstr, tmpstr); xml += L" <UPnPLocation>"; xml += tmpstr; xml += L"</UPnPLocation>" EOL; } //UPnPServiceId if (cond.mask & PROF_XMLELM_UPNP_SERVICEID) { ascii2unicode(UPnPServiceId, tmpstr); makeCDATA(tmpstr, tmpstr); xml += L" <UPnPServiceId>"; xml += tmpstr; xml += L"</UPnPServiceId>" EOL; } //limits if (cond.mask & PROF_XMLELM_LIMIT) { swprintf_s(tmp, 16, L"%u", P2PSessionLimit); xml += L" <p2psessionlimit>"; xml += tmp; xml += L"</p2psessionlimit>" EOL; /* swprintf_s(tmp, 16, L"%u", NodeLimit); xml += L" <nodelimit>"; xml += tmp; xml += L"</nodelimit>" EOL; */ swprintf_s(tmp, 16, L"%u", KeyLimit); xml += L" <keylimit>"; xml += tmp; xml += L"</keylimit>" EOL; swprintf_s(tmp, 16, L"%u", QueryLimit); xml += L" <querylimit>"; xml += tmp; xml += L"</querylimit>" EOL; swprintf_s(tmp, 16, L"%u", LogLimit); xml += L" <loglimit>"; xml += tmp; xml += L"</loglimit>" EOL; swprintf_s(tmp, 16, L"%u", NetLogLimit); xml += L" <netloglimit>"; xml += tmp; xml += L"</netloglimit>" EOL; swprintf_s(tmp, 16, L"%u", HokanLogLimit); xml += L" <hokanloglimit>"; xml += tmp; xml += L"</hokanloglimit>" EOL; swprintf_s(tmp, 16, L"%u", IPFLogLimit); xml += L" <ipfloglimit>"; xml += tmp; xml += L"</ipfloglimit>" EOL; swprintf_s(tmp, 32, L"%I64u", QuarterSize); xml += L" <quartersize>"; xml += tmp; xml += L"</quartersize>" EOL; swprintf_s(tmp, 16, L"%u", QuarterFullOperation); xml += L" <quarterfulloperation>"; xml += tmp; xml += L"</quarterfulloperation>" EOL; swprintf_s(tmp, 16, L"%u", ResumeDelayMs); xml += L" <ResumeDelayMs>"; xml += tmp; xml += L"</ResumeDelayMs>" EOL; } if (cond.mask & PROF_XMLELM_BOOL) { xml += L" <port0>"; xml += (Port0 ? L"1" : L"0"); xml += L"</port0>" EOL; xml += L" <p2pautostart>"; xml += (P2PAutoStart ? L"1" : L"0"); xml += L"</p2pautostart>" EOL; xml += L" <loadsubdirindex>"; xml += (LoadSubdirIndex ? L"1" : L"0"); xml += L"</loadsubdirindex>" EOL; xml += L" <maruuser>"; xml += (MaruUser ? L"1" : L"0"); xml += L"</maruuser>" EOL; xml += L" <publicprofile>"; xml += (PublicReport ? L"1" : L"0"); xml += L"</publicprofile>" EOL; xml += L" <publicrecentdat>"; xml += (PublicRecentDat ? L"1" : L"0"); xml += L"</publicrecentdat>" EOL; xml += L" <baloon_p2p>"; xml += (Baloon_P2P ? L"1" : L"0"); xml += L"</baloon_p2p>" EOL; xml += L" <baloon_query>"; xml += (Baloon_Query ? L"1" : L"0"); xml += L"</baloon_query>" EOL; xml += L" <baloon_hokan>"; xml += (Baloon_Hokan ? L"1" : L"0"); xml += L"</baloon_hokan>" EOL; xml += L" <baloon_im>"; xml += (Baloon_IM ? L"1" : L"0"); xml += L"</baloon_im>" EOL; xml += L" <AutoResume>"; xml += (AutoResume ? L"1" : L"0"); xml += L"</AutoResume>" EOL; xml += L" <UseUPnP>"; xml += (UseUPnP ? L"1" : L"0"); xml += L"</UseUPnP>" EOL; } Unlock(); xml += L"</"; xml += cond.rootelement; xml += L">" EOL; return (FromUnicode(cond.charset.c_str(), xml, out)); }
void O2ReportMaker:: GetReport(string &out, bool pub) { double ptime; double ptimeavg; int handle_c; int thread_c; PerformanceCounter->GetValue(ptime, ptimeavg, handle_c, thread_c); long tzoffset; _get_timezone(&tzoffset); // start time time_t starttime = PerformanceCounter->GetStartTime(); wchar_t starttime_str[32]; if (starttime != 0) { time_t t = starttime - tzoffset; struct tm tm; gmtime_s(&tm, &t); wcsftime(starttime_str, 32, L"%Y/%m/%d %H:%M:%S", &tm); } else wcscpy_s(starttime_str, 32, L"-"); // uptime uint64 uptime = PerformanceCounter->GetUptime(); wchar_t uptime_str[32]; if (uptime != 0) { swprintf_s(uptime_str, 32, L"%I64dd %02I64d:%02I64d:%02I64d", uptime/86400, (uptime%86400)/3600, (uptime%3600)/60, uptime%60); } else wcscpy_s(uptime_str, 32, L"-"); // uptime (累計) uint64 total_uptime = PerformanceCounter->GetTotalUptime() + uptime; wchar_t total_uptime_str[32]; swprintf_s(total_uptime_str, 32, L"%I64dd %02I64d:%02I64d:%02I64d", total_uptime/86400, (total_uptime%86400)/3600, (total_uptime%3600)/60, total_uptime%60); wchar_t ptime_str[32]; swprintf_s(ptime_str, 32, L"%.1f%% (%.1f%%)", ptime, ptimeavg); // 送受信バイト数 (現在のセッション) uint64 total_u = Server_P2P->GetSendByte() + Client->GetSendByte(); uint64 total_d = Server_P2P->GetRecvByte() + Client->GetRecvByte(); wchar_t traffic_u[32]; swprintf_s(traffic_u, 32, L"%.1f(%.1f)", (uptime == 0 ? 0 : (double)total_u/1024/uptime), (uptime == 0 ? 0 : (double)total_u/uptime*8)); wchar_t traffic_d[32]; swprintf_s(traffic_d, 32, L"%.1f(%.1f)", (uptime == 0 ? 0 : (double)total_d/1024/uptime), (uptime == 0 ? 0 : (double)total_d/uptime*8)); wchar_t traffic_ud[32]; swprintf_s(traffic_ud, 32, L"%.1f(%.1f)", (uptime == 0 ? 0 : (double)(total_u+total_d)/1024/uptime), (uptime == 0 ? 0 : (double)(total_u+total_d)/uptime*8)); // 送受信バイト数 (累計) uint64 accum_total_u = PerformanceCounter->GetTotalSend() + total_u; uint64 accum_total_d = PerformanceCounter->GetTotalRecv() + total_d; wchar_t a_traffic_u[32]; swprintf_s(a_traffic_u, 32, L"%.1f(%.1f)", (total_uptime == 0 ? 0 : (double)accum_total_u/1024/total_uptime), (total_uptime == 0 ? 0 : (double)accum_total_u/total_uptime*8)); wchar_t a_traffic_d[32]; swprintf_s(a_traffic_d, 32, L"%.1f(%.1f)", (total_uptime == 0 ? 0 : (double)accum_total_d/1024/total_uptime), (total_uptime == 0 ? 0 : (double)accum_total_d/total_uptime*8)); wchar_t a_traffic_ud[32]; swprintf_s(a_traffic_ud, 32, L"%.1f(%.1f)", (total_uptime == 0 ? 0 : (double)(accum_total_u+accum_total_d)/1024/total_uptime), (total_uptime == 0 ? 0 : (double)(accum_total_u+accum_total_d)/total_uptime*8)); //dat数、サイズ uint64 datnum = 0; uint64 datsize = 0; uint64 pubnum = 0; DatDB->select_report(PUBLISH_ORIGINAL_TT, datnum, datsize, pubnum); //publish率 wchar_t publishper[32]; if (datnum == 0) wcscpy_s(publishper, 32, L"0.0%"); else { swprintf(publishper, 32, L"%.1f%% (%I64u)", (double)pubnum/datnum*100.0, pubnum); } wstring tmpstr; wstring xml; xml += L"<?xml version=\"1.0\" encoding=\""; xml += _T(DEFAULT_XML_CHARSET); xml += L"\"?>"EOL; if (pub) xml += L"<?xml-stylesheet type=\"text/xsl\" href=\"/profile.xsl\"?>"; xml += L"<report>"EOL; // // 名前、コメント、閲覧履歴 // if (pub) { makeCDATA(Profile->GetNodeNameW(), tmpstr); xml += L"<name>"; xml += tmpstr; xml += L"</name>"EOL; xml += L"<category>"EOL; xml += L"<table>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"ID"); hashT hash; Profile->GetID(hash); wstring hashstr; hash.to_string(hashstr); xml_AddElement(xml, L"td", L"class=\"L\"", hashstr.c_str()); xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"コメント"); makeCDATA(Profile->GetComment(), tmpstr); xml += L" <pre>"; xml += tmpstr; xml += L"</pre>"EOL; xml += L"</tr>"EOL; // if (Profile->IsPublicRecentDat()) { xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"閲覧履歴"); xml += L"<pre>"; O2KeyList recent; Server_Proxy->GetRecentDatList(recent); tmpstr.erase(); for (O2KeyListIt it = recent.begin(); it != recent.end(); it++) { wchar_t timestr[TIMESTR_BUFF_SIZE]; struct tm tm; localtime_s(&tm, &it->date); wcsftime(timestr, TIMESTR_BUFF_SIZE, L"%Y/%m/%d %H:%M:%S", &tm); tmpstr += timestr; tmpstr += L" [ "; tmpstr += it->url; tmpstr += L" ] "; tmpstr += it->title; tmpstr += L"\r\n"; } makeCDATA(tmpstr, tmpstr); xml += tmpstr; xml += L"</pre>"EOL; xml += L"</tr>"EOL; } xml += L"</table>"EOL; xml += L"</category>"EOL; } // // 概要 // if (!pub || Profile->IsPublicReport()) { xml += L"<category>"EOL; xml_AddElement(xml, L"caption", NULL, L"概要"); xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"状態"); xml_AddElement(xml, L"td", L"type=\"h\"", L"CPU(平均)"); xml_AddElement(xml, L"td", L"type=\"h\"", L"ハンドル"); xml_AddElement(xml, L"td", L"type=\"h\"", L"スレッド"); xml_AddElement(xml, L"td", L"type=\"h\"", L"総dat数"); xml_AddElement(xml, L"td", L"type=\"h\"", L"総datサイズ"); xml_AddElement(xml, L"td", L"type=\"h\"", L"publish率"); xml += L"</tr>"EOL; xml += L"<tr>"EOL; if (PerformanceCounter->IsActive()) xml_AddElement(xml, L"td", L"class=\"active\"", L"稼動中"); else xml_AddElement(xml, L"td", L"class=\"deactive\"", L"停止中"); xml_AddElement(xml, L"td", L"class=\"C\"", ptime_str); xml_AddElement(xml, L"td", L"class=\"N\"", handle_c); xml_AddElement(xml, L"td", L"class=\"N\"", thread_c); xml_AddElement(xml, L"td", L"class=\"N\"", datnum); xml_AddElement(xml, L"td", L"class=\"N\"", datsize); xml_AddElement(xml, L"td", L"class=\"R\"", publishper); xml += L"</tr>"EOL; xml += L"</table>"EOL; // xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"起動日時"); xml_AddElement(xml, L"td", L"type=\"h\"", L"グローバルIP"); xml_AddElement(xml, L"td", (Server_P2P->IsActive() ? L"type=\"h\" class=\"active\"" : L"type=\"h\" class=\"deactive\""), L"P2P"); xml_AddElement(xml, L"td", (Server_Proxy->IsActive() ? L"type=\"h\" class=\"active\"" : L"type=\"h\" class=\"deactive\""), L"Proxy"); xml_AddElement(xml, L"td", (Server_Admin->IsActive() ? L"type=\"h\" class=\"active\"" : L"type=\"h\" class=\"deactive\""), L"Admin"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Ver"); xml += L"</tr>"EOL; xml += L"<tr>"EOL; wstring ipstr; ulong2ipstr(Profile->GetIP(), ipstr); xml_AddElement(xml, L"td", L"class=\"C\"", starttime_str); xml_AddElement(xml, L"td", L"class=\"C\"", ipstr.c_str()); xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetP2PPort()); xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetProxyPort()); xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetAdminPort()); xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetUserAgentW()); xml += L"</tr>"EOL; xml += L"</table>"EOL; // xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"type=\"h\"", L"稼働時間"); xml_AddElement(xml, L"td", L"type=\"h\"", L"上り"); xml_AddElement(xml, L"td", L"type=\"h\"", L"下り"); xml_AddElement(xml, L"td", L"type=\"h\"", L"合計"); xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"type=\"h\"", L"上りKB/s(bps)"); xml_AddElement(xml, L"td", L"type=\"h\"", L"下りKB/s(bps)"); xml_AddElement(xml, L"td", L"type=\"h\"", L"合計KB/s(bps)"); xml += L"</tr>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"今回"); xml_AddElement(xml, L"td", L"class=\"C\"", uptime_str); xml_AddElement(xml, L"td", L"class=\"N\"", total_u); xml_AddElement(xml, L"td", L"class=\"N\"", total_d); xml_AddElement(xml, L"td", L"class=\"N\"", total_u+total_d); xml_AddElement(xml, L"td", L"", L""); xml_AddElement(xml, L"td", L"class=\"R\"", traffic_u); xml_AddElement(xml, L"td", L"class=\"R\"", traffic_d); xml_AddElement(xml, L"td", L"class=\"R\"", traffic_ud); xml += L"</tr>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"累計"); xml_AddElement(xml, L"td", L"class=\"C\"", total_uptime_str); xml_AddElement(xml, L"td", L"class=\"N\"", accum_total_u); xml_AddElement(xml, L"td", L"class=\"N\"", accum_total_d); xml_AddElement(xml, L"td", L"class=\"N\"", accum_total_u+accum_total_d); xml_AddElement(xml, L"td", L"", L""); xml_AddElement(xml, L"td", L"class=\"R\"", a_traffic_u); xml_AddElement(xml, L"td", L"class=\"R\"", a_traffic_d); xml_AddElement(xml, L"td", L"class=\"R\"", a_traffic_ud); xml += L"</tr>"EOL; xml += L"</table>"EOL; xml += L"</category>"EOL; // // DB // xml += L"<category>"EOL; xml_AddElement(xml, L"caption", NULL, L"DB"); xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"type=\"h\"", L"Node"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Friend"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Key"); xml_AddElement(xml, L"td", L"type=\"h\"", L"SakuKey"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Query"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Saku"); xml_AddElement(xml, L"td", L"type=\"h\"", L"IM"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Broadcast"); xml_AddElement(xml, L"td", L"type=\"h\"", L"BCQueue"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Logger"); xml_AddElement(xml, L"td", L"type=\"h\"", L"IPFilter"); xml_AddElement(xml, L"td", L"type=\"h\"", L"DatRequest"); xml += L"</tr>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"保持数"); xml_AddElement(xml, L"td", L"class=\"N\"", NodeDB->count()); xml_AddElement(xml, L"td", L"class=\"N\"", FriendDB->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", KeyDB->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", SakuKeyDB->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", QueryDB->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", SakuDB->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", IMDB->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", BroadcastDB->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", Job_Broadcast->GetQueueCount()); xml_AddElement(xml, L"td", L"class=\"N\"", Logger->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", IPFilter_P2P->Count()+IPFilter_Proxy->Count()+IPFilter_Admin->Count()); xml_AddElement(xml, L"td", L"class=\"N\"", Job_QueryDat->GetRequestQueueCount()); xml += L"</tr>"EOL; xml += L"</table>"EOL; xml += L"</category>"EOL; // // Server // xml += L"<category>"EOL; xml_AddElement(xml, L"caption", NULL, L"Server"); xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"type=\"h\"", L"dat"); xml_AddElement(xml, L"td", L"type=\"h\"", L"collection"); xml_AddElement(xml, L"td", L"type=\"h\"", L"im"); xml_AddElement(xml, L"td", L"type=\"h\"", L"broadcast"); xml_AddElement(xml, L"td", L"type=\"h\"", L"profile"); xml_AddElement(xml, L"td", L"type=\"h\"", L"ping"); xml_AddElement(xml, L"td", L"type=\"h\"", L"store"); xml_AddElement(xml, L"td", L"type=\"h\"", L"findnode"); xml_AddElement(xml, L"td", L"type=\"h\"", L"findvalue"); xml_AddElement(xml, L"td", L"type=\"h\"", L"ERROR"); xml_AddElement(xml, L"td", L"type=\"h\"", L"?"); xml_AddElement(xml, L"td", L"type=\"h\"", L"計"); xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"type=\"h\"", L"Proxy"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Admin"); xml += L"</tr>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"接続回数"); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("dat")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("collection")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("im")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("broadcast")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("profile")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("ping")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("store")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("findnode")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("findvalue")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("ERROR")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("?")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath(NULL)); xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetTotalSessionCount()); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetTotalSessionCount()); xml += L"</tr>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"up"); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("dat")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("collection")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("im")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("broadcast")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("profile")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ping")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("store")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findnode")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findvalue")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ERROR")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("?")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath(NULL)); xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetSendByte()); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetSendByte()); xml += L"</tr>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"down"); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("dat")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("collection")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("im")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("broadcast")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("profile")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("ping")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("store")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("findnode")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("findvalue")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("ERROR")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("?")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath(NULL)); xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetRecvByte()); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetRecvByte()); xml += L"</tr>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"up + down"); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("dat") + Server_P2P->GetRecvByteByPath("dat")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("collection") + Server_P2P->GetRecvByteByPath("collection")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("im") + Server_P2P->GetRecvByteByPath("im")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("broadcast") + Server_P2P->GetRecvByteByPath("broadcast")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("profile") + Server_P2P->GetRecvByteByPath("profile")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ping") + Server_P2P->GetRecvByteByPath("ping")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("store") + Server_P2P->GetRecvByteByPath("store")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findnode") + Server_P2P->GetRecvByteByPath("findnode")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findvalue") + Server_P2P->GetRecvByteByPath("findvalue")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ERROR") + Server_P2P->GetRecvByteByPath("ERROR")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("UNKNOWN") + Server_P2P->GetRecvByteByPath("UNKNOWN")); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath(NULL) + Server_P2P->GetRecvByteByPath(NULL)); xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetSendByte() + Server_Proxy->GetRecvByte()); xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetRecvByte() + Server_Admin->GetRecvByte()); xml += L"</tr>"EOL; xml += L"</table>"EOL; xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"同時接続数ピーク"); xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionPeak()); xml += L"</tr>"EOL; xml += L"</table>"EOL; xml += L"</category>"EOL; // // Agent // xml += L"<category>"EOL; xml_AddElement(xml, L"caption", NULL, L"Agent"); xml += L"<table>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L""); size_t i; for (i = 0; i < Jobs.size(); i++) { if (Jobs[i]->IsActive()) xml_AddElement(xml, L"td", L"type=\"h\" class=\"active\"", Jobs[i]->GetName()); else xml_AddElement(xml, L"td", L"type=\"h\" class=\"deactive\"", Jobs[i]->GetName()); } xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"実行"); for (i = 0; i < Jobs.size(); i++) { if (!Jobs[i]->IsActive()) xml_AddElement(xml, L"td", L"class=\"C\"", L"-"); else if (Jobs[i]->IsWorking()) xml_AddElement(xml, L"td", L"class=\"active\"", L"実行中"); else xml_AddElement(xml, L"td", L"class=\"wait\"", L"待機"); } xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"間隔(s)"); for (i = 0; i < Jobs.size(); i++) { if (!Jobs[i]->IsActive()) xml_AddElement(xml, L"td", L"class=\"C\"", L"-"); else xml_AddElement(xml, L"td", L"class=\"C\"", Jobs[i]->GetInterval()); } xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"起動まで"); for (i = 0; i < Jobs.size(); i++) { if (!Jobs[i]->IsActive() || Jobs[i]->IsWorking()) xml_AddElement(xml, L"td", L"class=\"C\"", L"-"); else xml_AddElement(xml, L"td", L"class=\"C\"", Jobs[i]->GetRemain()); } xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"接続回数"); for (i = 0; i < Jobs.size(); i++) { if (!Jobs[i]->IsActive()) xml_AddElement(xml, L"td", L"class=\"R\"", L"-"); else xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetTotalSessionCount()); } xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"up"); for (i = 0; i < Jobs.size(); i++) { if (!Jobs[i]->IsActive()) xml_AddElement(xml, L"td", L"class=\"R\"", L"-"); else xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetSendByte()); } xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"down"); for (i = 0; i < Jobs.size(); i++) { if (!Jobs[i]->IsActive()) xml_AddElement(xml, L"td", L"class=\"R\"", L"-"); else xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetRecvByte()); } xml += L"</tr>"EOL; // xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"up+down"); for (i = 0; i < Jobs.size(); i++) { if (!Jobs[i]->IsActive()) xml_AddElement(xml, L"td", L"class=\"R\"", L"-"); else xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetSendByte()+Jobs[i]->GetRecvByte()); } xml += L"</tr>"EOL; xml += L"</table>"EOL; xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L"同時接続数ピーク"); xml_AddElement(xml, L"td", L"class=\"N\"", Client->GetSessionPeak()); xml += L"</tr>"EOL; xml += L"</table>"EOL; xml += L"</category>"EOL; if (O2DEBUG && TRACE_CONNECTIONS && !pub) { // // Connections // xml += L"<category>"EOL; xml_AddElement(xml, L"caption", NULL, L"Connections"); xml += L"<table>"EOL; xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"type=\"h\"", L""); xml_AddElement(xml, L"td", L"type=\"h\"", L"IP"); xml_AddElement(xml, L"td", L"type=\"h\"", L"Port"); xml_AddElement(xml, L"td", L"type=\"h\"", L"接続時間(s)"); xml_AddElement(xml, L"td", L"type=\"h\"", L"recv"); xml_AddElement(xml, L"td", L"type=\"h\"", L"send"); xml_AddElement(xml, L"td", L"type=\"h\"", L"rbuff"); xml += L"</tr>"EOL; O2SocketSessionPList lst; time_t now = time(NULL); Server_P2P->GetSessionList(lst); for (O2SocketSessionPListIt it = lst.begin(); it != lst.end(); it++) { O2SocketSession *ss = *it; wstring e_ip; ip2e(ss->ip, e_ip); xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"class=\"C\"", L"Server"); xml_AddElement(xml, L"td", L"class=\"C\"", e_ip.c_str()); xml_AddElement(xml, L"td", L"class=\"C\"", ss->port); xml_AddElement(xml, L"td", L"class=\"R\"", now - ss->connect_t); xml_AddElement(xml, L"td", L"class=\"N\"", ss->rbuffoffset); xml_AddElement(xml, L"td", L"class=\"N\"", ss->sbuffoffset); wstring rbuff; ascii2unicode(ss->rbuff, rbuff); xml_AddElement(xml, L"td", L"class=\"L\"", rbuff.c_str(), true); xml += L"</tr>"EOL; delete *it; } lst.clear(); Client->GetSessionList(lst); for (O2SocketSessionPListIt it = lst.begin(); it != lst.end(); it++) { O2SocketSession *ss = *it; wstring e_ip; ip2e(ss->ip, e_ip); xml += L"<tr>"EOL; xml_AddElement(xml, L"td", L"class=\"C\"", L"Agent"); xml_AddElement(xml, L"td", L"class=\"C\"", e_ip.c_str()); xml_AddElement(xml, L"td", L"class=\"C\"", ss->port); xml_AddElement(xml, L"td", L"class=\"R\"", now - ss->connect_t); xml_AddElement(xml, L"td", L"class=\"N\"", ss->rbuffoffset); xml_AddElement(xml, L"td", L"class=\"N\"", ss->sbuffoffset); wstring rbuff; ascii2unicode(ss->rbuff, rbuff); xml_AddElement(xml, L"td", L"class=\"L\"", rbuff.c_str(), true); xml += L"</tr>"EOL; delete *it; } xml += L"</table>"EOL; xml += L"</category>"EOL; } } xml += L"</report>"EOL; FromUnicode(_T(DEFAULT_XML_CHARSET), xml, out); }
void O2IMDB:: MakeIMElement(O2IMessage &im, O2IMSelectCondition &cond, wstring &xml) { wchar_t tmp[16]; wstring tmpstr; xml += L"<message>" EOL; if (cond.mask & IM_XMLELM_IP) { ip2e(im.ip, tmpstr); xml += L" <ip>"; xml += tmpstr; xml += L"</ip>" EOL; } if (cond.mask & IM_XMLELM_PORT) { swprintf_s(tmp, 16, L"%d", im.port); xml += L" <port>"; xml += tmp; xml += L"</port>" EOL; } if (cond.mask & IM_XMLELM_ID) { im.id.to_string(tmpstr); xml += L" <id>"; xml += tmpstr; xml += L"</id>" EOL; } if (cond.mask & IM_XMLELM_PUBKEY) { im.pubkey.to_string(tmpstr); xml += L" <pubkey>"; xml += tmpstr; xml += L"</pubkey>" EOL; } if (cond.mask & IM_XMLELM_NAME) { xml += L" <name>"; xml += im.name; xml += L"</name>" EOL; } if (cond.mask & IM_XMLELM_DATE) { if (im.date == 0) xml += L" <date></date>" EOL; else { long tzoffset; #ifdef _WIN32 /** windows */ _get_timezone(&tzoffset); #else /** unix */ tzoffset = getGmtOffset(); #endif if (!cond.timeformat.empty()) { time_t t = im.date - tzoffset; wchar_t timestr[TIMESTR_BUFF_SIZE]; struct tm tm; #ifdef _WIN32 /** windows */ gmtime_s(&tm, &t); #else /** unix */ gmtime_r(&t, &tm); #endif wcsftime(timestr, TIMESTR_BUFF_SIZE, cond.timeformat.c_str(), &tm); xml += L" <date>"; xml += timestr; xml += L"</date>" EOL; } else { time_t2datetime(im.date, - tzoffset, tmpstr); xml += L" <date>"; xml += tmpstr; xml += L"</date>" EOL; } } } if (cond.mask & IM_XMLELM_MSG) { makeCDATA(im.msg, tmpstr); xml += L" <msg>"; xml += tmpstr; xml += L"</msg>" EOL; } if (cond.mask & IM_XMLELM_KEY) { im.key.to_string(tmpstr); xml += L" <key>"; xml += tmpstr; xml += L"</key>" EOL; } if (cond.mask & IM_XMLELM_MINE) { xml += L" <mine>"; xml += im.mine ? L"1" : L"0"; xml += L"</mine>" EOL; } xml += L"</message>" EOL; }
bool O2IMDB:: MakeSendXML(const O2IMessage &im, string &out) { wstring xml; wstring tmpstr; wchar_t tmp[16]; xml += L"<?xml version=\"1.0\" encoding=\""; xml += _T(DEFAULT_XML_CHARSET); xml += L"\"?>" EOL; xml += L"<messages>" EOL; xml += L"<message>" EOL; ip2e(im.ip, tmpstr); xml += L" <ip>"; xml += tmpstr; xml += L"</ip>" EOL; swprintf_s(tmp, 16, L"%d", im.port); xml += L" <port>"; xml += tmp; xml += L"</port>" EOL; im.id.to_string(tmpstr); xml += L" <id>"; xml += tmpstr; xml += L"</id>" EOL; im.pubkey.to_string(tmpstr); xml += L" <pubkey>"; xml += tmpstr; xml += L"</pubkey>" EOL; xml += L" <name>"; xml += im.name; xml += L"</name>" EOL; makeCDATA(im.msg, tmpstr); xml += L" <msg>"; xml += tmpstr; xml += L"</msg>" EOL; im.key.to_string(tmpstr); xml += L" <key>"; xml += tmpstr; xml += L"</key>" EOL; for (hashListT::const_iterator it = im.paths.begin(); it != im.paths.end(); it++) { it->to_string(tmpstr); xml += L" <path>"; xml += tmpstr; xml += L"</path>" EOL; } xml += L"</message>" EOL; xml += L"</messages>" EOL; FromUnicode(_T(DEFAULT_XML_CHARSET), xml, out); return true; }
uint O2Agent:: NetIOThread(void) { O2SocketSessionListIt ssit; int lasterror; while (Active) { //setup FD fd_set readfds; fd_set writefds; FD_ZERO(&readfds); FD_ZERO(&writefds); //wait Lock(); uint n = sss.size(); Unlock(); if (n == 0) { ResetEvent(SessionAvailableEvent); } WaitForSingleObject(SessionAvailableEvent, INFINITE); if (!Active) break; //FD Lock(); for (ssit = sss.begin(); ssit != sss.end(); ssit++) { O2SocketSession *ss = *ssit; if (!ss->sendcomplete) FD_SET(ss->sock, &writefds); else FD_SET(ss->sock, &readfds); } Unlock(); //select struct timeval tv; tv.tv_sec = SELECT_TIMEOUT_MS/1000; tv.tv_usec = SELECT_TIMEOUT_MS%1000; select(0, &readfds, &writefds, NULL, &tv); // // 既存セッションとの送受信 // Lock(); ssit = sss.begin(); Unlock(); while (1) { bool loopend = false; Lock(); if (ssit == sss.end()) loopend = true; Unlock(); if (loopend) break; #if DEBUG_THREADLOOP && defined(_DEBUG) TRACEA("[NetIO]\n"); #endif O2SocketSession *ss = *ssit; O2AgentService *service = (O2AgentService*)ss->service; ushort port = htons(ss->sin.sin_port); wstring ipstr; #if defined (_DEBUG) ulong2ipstr(ss->sin.sin_addr.S_un.S_addr, ipstr); #else ip2e(ss->sin.sin_addr.S_un.S_addr, ipstr); #endif //send if (FD_ISSET(ss->sock, &writefds)) { int len; const char *buff = ss->GetSendBuffer(len); if (len > 0) { int n = send(ss->sock, buff, len, 0); #if DEBUG_THREADLOOP && defined(_DEBUG) TRACEA("[A]send\n"); #endif if (n > 0) { ss->UpdateSend(n); NodeDB->IncrementSendByte_me2n(ss->sin.sin_addr.S_un.S_addr, n); service->IncrementSendByte(n); service->OnSend(ss); ss->UpdateTimer(); if (hwndSetIconCallback) { PostMessage(hwndSetIconCallback, msgSetIconCallback, 1, 0); } } else if (n == 0) { ; } else if ((lasterror = WSAGetLastError()) != WSAEWOULDBLOCK) { if (Logger) { Logger->AddLog(O2LT_NET, MODULE, L"送信エラー(%d) (%s %s:%d %dbyte)", lasterror, service->GetName(), ipstr.c_str(), port, ss->sbuff.size()); } ss->SetActive(false); } } } //recv if (FD_ISSET(ss->sock, &readfds)) { char buff[RECVBUFFSIZE]; int n = recv(ss->sock, buff, RECVBUFFSIZE, 0); #if DEBUG_THREADLOOP && defined(_DEBUG) TRACEA("[A]recv\n"); #endif if (n > 0) { ss->AppendRecv(buff, n); NodeDB->IncrementRecvByte_me2n(ss->sin.sin_addr.S_un.S_addr, n); service->IncrementRecvByte(n); service->OnRecv(ss); ss->UpdateTimer(); if (hwndSetIconCallback) { PostMessage(hwndSetIconCallback, msgSetIconCallback, 0, 0); } } else if (n == 0) { if (Logger) { Logger->AddLog(O2LT_NET, MODULE, L"受信0 (%s %s:%d)", service->GetName(), ipstr.c_str(), port); } ss->SetActive(false); } else if ((lasterror = WSAGetLastError()) != WSAEWOULDBLOCK) { if (Logger) { Logger->AddLog(O2LT_NET, MODULE, L"受信エラー(%d) (%s %s:%d %dbyte)", lasterror, service->GetName(), ipstr.c_str(), port, ss->rbuff.size()); } ss->SetActive(false); } } //delete if (!ss->IsActive() || ss->GetPastTime() >= SOCKET_TIMEOUT_S) { void *databk = ss->data; ulong ip = ss->sin.sin_addr.S_un.S_addr; closesocket(ss->sock); service->OnClose(ss); NodeDB->RemoveStatusBit(ip, O2_NODESTATUS_LINKEDTO); NodeDB->AddStatusBit(ip, O2_NODESTATUS_PASTLINKEDTO); service->DecrementCount(); if (!ss->rbuff.empty() && !ss->sbuff.empty()) { NodeDB->UpdateLastModified(ip, 2); service->IncrementTotalSessionCount(); } else if (ss->rbuff.empty()) NodeDB->IncrementErrorCount(ip, 1); if (!ss->rbuff.empty() && (!databk || ss->rbuff[0] != 'H')) { NodeDB->DeleteNode(ip); if (Logger) { Logger->AddLog(O2LT_WARNING, MODULE, L"不正データ受信 (ノード削除: %s:%d)", ipstr.c_str(), htons(ss->sin.sin_port)); } if (O2DEBUG) { char filename[256]; sprintf_s(filename, 256, "dump\\A_%d.txt", rand()); FILE *fp; fopen_s(&fp, filename, "wb"); fwrite(ss->rbuff.c_str(), ss->rbuff.size(), 1, fp); fclose(fp); } } #if DEBUG_SESSION_COUNT && defined(_DEBUG) wchar_t abc[256]; swprintf(abc, L"■■削除■■ count:%d limit:%d %s\n", service->GetSessionCount(), service->GetSessionLimit(), service->GetName()); TRACEW(abc); #endif Lock(); ssit = sss.erase(ssit); Unlock(); delete ss; continue; } Sleep(1); ssit++; } } //end Lock(); for (ssit = sss.begin(); ssit != sss.end(); ssit++) { O2SocketSession *ss = *ssit; closesocket(ss->sock); ss->sock = 0; ((O2AgentService*)((O2AgentService*)ss->service))->OnClose(ss); delete ss; } sss.clear(); Unlock(); return (0); }
uint O2Agent:: LaunchThread(void) { for (uint i = 0; i < Services.size(); i++) { Services[i]->SetActive(true); Services[i]->OnServiceStart(); } Agent_GetGlobalIP->SetActive(true); Agent_GetGlobalIP->OnServiceStart(); if (Logger) Logger->AddLog(O2LT_INFO, MODULE, L"エージェント正常起動"); time_t prevconnecttime = time(NULL); uint index = 0; while (Active) { index %= Services.size(); /* * ウェイト処理 */ if (NodeDB->Count() == 0) { #if DEBUG_THREADLOOP && defined(_DEBUG) TRACEA("■Node 0\n"); #endif Sleep(1000); continue; } uint pasttime_ms = ((uint)time(NULL) - (uint)prevconnecttime) * 1000; if (pasttime_ms < Interval) { uint sleeptime_ms = Interval - pasttime_ms; #if DEBUG_THREADLOOP && defined(_DEBUG) TRACEA("Wait interval\n"); #endif if (Agent_GetGlobalIP->IsActive()) { ; //グローバルIP未確定のときは急ぐ } else { if (sleeptime_ms < 1000) Sleep(sleeptime_ms); else Sleep(1000); continue; } } /* * サービス起動 */ O2AgentService *service = Services[index]; if (Agent_GetGlobalIP->IsActive()) //グローバルIP未決定のとき service = Agent_GetGlobalIP; //強制的にAgent_GetGlobalIP起動 #if DEBUG_SESSION_COUNT && defined(_DEBUG) wchar_t abc[256]; swprintf(abc, L"● count:%d limit:%d %s\n", service->GetSessionCount(), service->GetSessionLimit(), service->GetName()); TRACEW(abc); #endif if (!service->IsActive()) { index++; continue; } if (service->GetSessionCount() >= service->GetSessionLimit()) { Sleep(500); index++; continue; } O2SocketSession *ss = new O2SocketSession(); ss->service = (void*)service; ulong ip; ushort port; wstring ipstr; //接続先ノード決定 //接続 TODO:クラスタリング if (service->HaveNodeDecision()) { service->OnLaunch(ss); if (!ss->IsActive()) { delete ss; index++; continue; } ip = ss->sin.sin_addr.S_un.S_addr; port = htons(ss->sin.sin_port); } else if (!NodeDB->GetNodeByPriority(ip, port)) { if (Logger) { Logger->AddLog(O2LT_WARNING, MODULE, L"有効なノード情報が無いので接続不可(%s)", service->GetName()); } delete ss; index++; continue; } #if !defined(_DEBUG) if (ip == Profile->GetIP() || ip == 0x0100007f) { #if 0 struct in_addr addr; addr.S_un.S_addr = ip; if (Logger) { Logger->AddLog(O2LT_WARNING, MODULE, "自ノード情報破棄 IP: %s Port: %d", inet_ntoa(addr), port); } #endif NodeDB->DeleteNode(ip); delete ss; index++; continue; } #endif #if defined(_DEBUG) ulong2ipstr(ip, ipstr); #else ip2e(ip, ipstr); #endif /* * Socket生成 */ ss->sock = socket(AF_INET, SOCK_STREAM, 0); if (ss->sock == INVALID_SOCKET) { if (Logger) Logger->AddLog(O2LT_ERROR, MODULE, L"ソケット生成に失敗"); delete ss; index++; continue; } ss->sin.sin_family = AF_INET; ss->sin.sin_port = htons(port); ss->sin.sin_addr.S_un.S_addr = ip; /* * Connect */ int timeout = service == Agent_GetGlobalIP ? GIP_CONNECT_TIMEOUT_MS : CONNECT_TIMEOUT_MS; if (connect2(ss->sock, (struct sockaddr*)&ss->sin, sizeof(ss->sin), timeout) != 0) { //NodeDB->DeleteNode(ip); NodeDB->IncrementErrorCount(ip, 1); if (Logger) { Logger->AddLog(O2LT_NET, MODULE, L"connect失敗(%s %s:%d)", service->GetName(), ipstr.c_str(), port); } closesocket(ss->sock); delete ss; index++; continue; } if (hwndSetIconCallback) { PostMessage(hwndSetIconCallback, msgSetIconCallback, 1, 0); } //launch if (!service->HaveNodeDecision()) { service->OnLaunch(ss); if (!ss->IsActive()) { closesocket(ss->sock); delete ss; index++; continue; } } ss->UpdateTimer(); service->IncrementCount(); Lock(); sss.push_back(ss); Unlock(); SetEvent(SessionAvailableEvent); NodeDB->AddStatusBit(ip, O2_NODESTATUS_LINKEDTO); prevconnecttime = time(NULL); index++; #if DEBUG_SESSION_COUNT && defined(_DEBUG) swprintf(abc, L"●● count:%d limit:%d %s\n", service->GetSessionCount(), service->GetSessionLimit(), service->GetName()); TRACEW(abc); #endif if (Logger) { Logger->AddLog(O2LT_NET, MODULE, L"connect成功 (%s %s:%d)", service->GetName(), ipstr.c_str(), port); } } //end Lock(); SetEvent(SessionAvailableEvent); Unlock(); for (uint i = 0; i < Services.size(); i++) { O2AgentService *service = Services[i]; if (service->IsActive()) { service->SetActive(false); service->OnServiceEnd(); } } if (Logger) Logger->AddLog(O2LT_INFO, MODULE, L"エージェント正常終了"); return (0); }
void O2Client:: NetIOThread(void) { O2SocketSessionPListIt ssit; int lasterror; while (Active) { // Signal Off SessionListLock.Lock(); { if (sss.empty()) SessionExistSignal.Off(); } SessionListLock.Unlock(); // Wait SessionExistSignal.Wait(); if (!Active) break; // Setup FD fd_set readfds; fd_set writefds; FD_ZERO(&readfds); FD_ZERO(&writefds); SessionListLock.Lock(); { for (ssit = sss.begin(); ssit != sss.end(); ssit++) { O2SocketSession *ss = *ssit; if (ss->can_send) FD_SET(ss->sock, &writefds); if (ss->can_recv) FD_SET(ss->sock, &readfds); } } SessionListLock.Unlock(); // select struct timeval tv; tv.tv_sec = SELECT_TIMEOUT_MS/1000; tv.tv_usec = SELECT_TIMEOUT_MS%1000; select(0, &readfds, &writefds, NULL, &tv); if (!Active) break; // // 既存セッションとの送受信 // SessionListLock.Lock(); ssit = sss.begin(); SessionListLock.Unlock(); while (Active) { bool end = false; SessionListLock.Lock(); { if (ssit == sss.end()) end = true; } SessionListLock.Unlock(); if (end) break; O2SocketSession *ss = *ssit; // IP文字列 wstring ipstr; if (O2DEBUG) ulong2ipstr(ss->ip, ipstr); else ip2e(ss->ip, ipstr); // Send if (FD_ISSET(ss->sock, &writefds)) { int len; const char *buff = ss->GetNextSend(len); if (len > 0) { int n = send(ss->sock, buff, len, 0); if (n > 0) { ss->UpdateSend(n); ss->UpdateTimer(); SendByte += n; OnSend(ss); if (hwndSetIconCallback) { #if defined(_WIN32) && !defined(__WXWINDOWS__) /** Use ordinary windows api */ PostMessage(hwndSetIconCallback, msgSetIconCallback, 1, 0); #else /** Platform is not windows */ #warning "TODO: implement wxWidgets event method here" #endif } } else if (n == 0) { // do nothing } #ifdef _WIN32 /** Windows */ else if ((lasterror = WSAGetLastError()) != WSAEWOULDBLOCK) #else /** Unix */ else if (errno == EAGAIN) #endif { if (Logger) { Logger->AddLog(O2LT_NETERR, ClientName.c_str(), ss->ip, ss->port, L"送信エラー(%d)", lasterror); } ss->error = true; ss->Deactivate(); } } } // Recv if (FD_ISSET(ss->sock, &readfds)) { char buff[RECVBUFFSIZE]; int n = recv(ss->sock, buff, RECVBUFFSIZE, 0); if (n > 0) { ss->AppendRecv(buff, n); ss->UpdateTimer(); RecvByte += n; OnRecv(ss); if (hwndSetIconCallback) { #if defined(_WIN32) && !defined(__WXWINDOWS__) /** Use ordinary windows api */ PostMessage(hwndSetIconCallback, msgSetIconCallback, 0, 0); #else /** Platform is not windows */ #warning "TODO: implement wxWidgets event method here" #endif } } else if (n == 0) { /*if (Logger) { Logger->AddLog(O2LT_NETERR, ClientName.c_str(), ss->ip, ss->port, L"受信0"); }*/ ss->Deactivate(); } #ifdef _WIN32 /** Windows */ else if ((lasterror = WSAGetLastError()) != WSAEWOULDBLOCK) #else /** Unix */ else if (errno == EAGAIN) #endif { if (Logger) { Logger->AddLog(O2LT_NETERR, ClientName.c_str(), ss->ip, ss->port, L"受信エラー(%d)", lasterror); } ss->error = true; ss->Deactivate(); } }
void O2Client:: ConnectionThread(O2SocketSession *ss) { // IP文字列 wstring ipstr; if (O2DEBUG) ulong2ipstr(ss->ip, ipstr); else ip2e(ss->ip, ipstr); // Create Socket SOCKET sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET) { if (Logger) { Logger->AddLog(O2LT_NETERR, ClientName.c_str(), 0, 0, L"ソケット生成に失敗"); } ss->error = true; ss->Finish(); return; } sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(ss->port); #ifdef _WIN32 sin.sin_addr.S_un.S_addr = ss->ip; #else sin.sin_addr.s_addr = ss->ip; #endif // Connect if (connect2(sock, (struct sockaddr*)&sin, sizeof(sin), (int)(ss->connect_timeout_s*1000)) != 0) { if (Logger) { Logger->AddLog(O2LT_NETERR, ClientName.c_str(), ss->ip, ss->port, L"connect失敗"); } #ifdef _WIN32 /** winsock */ closesocket(sock); #else /** bsd socket */ close(sock); #endif TotalConnectError++; ss->error = true; ss->Finish(); return; } if (hwndSetIconCallback) { #if defined(_WIN32) && !defined(__WXWINDOWS__) PostMessage(hwndSetIconCallback, msgSetIconCallback, 1, 0); #else #warning "TODO: implement wxWidgets event method here" #endif } ss->sock = sock; ss->SetConnectTime(); ss->UpdateTimer(); ss->Activate(); TotalSessionCount++; OnConnect(ss); // push to session list SessionListLock.Lock(); { sss.push_back(ss); if (sss.size() > SessionPeak) SessionPeak = sss.size(); } SessionListLock.Unlock(); SessionExistSignal.On(); if (Logger) { Logger->AddLog(O2LT_NET, ClientName.c_str(), ss->ip, ss->port, L"connect"); } }
void O2KeyDB:: MakeKeyElement(const O2Key &key, O2KeySelectCondition &cond, wstring &xml) { wstring tmpstr; wchar_t tmp[32]; xml += L"<key>" EOL; if (cond.mask & KEY_XMLELM_HASH) { key.hash.to_string(tmpstr); xml += L" <hash>"; xml += tmpstr; xml += L"</hash>" EOL; } if (cond.mask & KEY_XMLELM_NODEID) { key.nodeid.to_string(tmpstr); xml += L" <nodeid>"; xml += tmpstr; xml += L"</nodeid>" EOL; } if (cond.mask & KEY_XMLELM_IP) { ip2e(key.ip, tmpstr); xml += L" <ip>"; xml += tmpstr; xml += L"</ip>" EOL; } if (cond.mask & KEY_XMLELM_PORT) { swprintf_s(tmp, 16, L"%d", key.port); xml += L" <port>"; xml += tmp; xml += L"</port>" EOL; } if (cond.mask & KEY_XMLELM_SIZE) { xml += L" <size>"; swprintf_s(tmp, 32, L"%I64u", key.size); xml += tmp; xml += L"</size>" EOL; } if (cond.mask & KEY_XMLELM_URL) { xml += L" <url>"; xml += key.url; xml += L"</url>" EOL; } if (cond.mask & KEY_XMLELM_TITLE) { makeCDATA(key.title, tmpstr); xml += L" <title>"; xml += tmpstr; xml += L"</title>" EOL; } if (cond.mask & KEY_XMLELM_NOTE) { makeCDATA(key.note, tmpstr); xml += L" <note>"; xml += tmpstr; xml += L"</note>" EOL; } if (cond.mask & KEY_XMLELM_IDKEYHASH) { key.idkeyhash.to_string(tmpstr); xml += L" <idkeyhash>"; xml += tmpstr; xml += L"</idkeyhash>" EOL; } if (cond.mask & KEY_XMLELM_DISTANCE) { swprintf_s(tmp, 16, L"%u", key.distance); xml += L" <distance>"; xml += tmp; xml += L"</distance>" EOL; } if (cond.mask & KEY_XMLELM_DATE) { if (key.date == 0) xml += L" <date></date>" EOL; else { long tzoffset; #ifdef _WIN32 /** windows */ _get_timezone(&tzoffset); #else /** unix */ tzoffset = getGmtOffset(); #endif if (!cond.timeformat.empty()) { time_t t = key.date - tzoffset; wchar_t timestr[TIMESTR_BUFF_SIZE]; struct tm tm; #ifdef _WIN32 /** windows */ gmtime_s(&tm, &t); #else /** unix */ gmtime_r(&t, &tm); #endif wcsftime(timestr, TIMESTR_BUFF_SIZE, cond.timeformat.c_str(), &tm); xml += L" <date>"; xml += timestr; xml += L"</date>" EOL; } else { time_t2datetime(key.date, -tzoffset, tmpstr); xml += L" <date>"; xml += tmpstr; xml += L"</date>" EOL; } } } if (cond.mask & KEY_XMLELM_ENABLE) { xml += L" <enable>"; xml += key.enable ? L"enable" : L"disable"; xml += L"</enable>" EOL; } xml += L"</key>" EOL; }
void O2Client:: NetIOThread(void) { O2SocketSessionPListIt ssit; int lasterror; while (Active) { // Signal Off SessionListLock.Lock(); { if (sss.empty()) SessionExistSignal.Off(); } SessionListLock.Unlock(); // Wait SessionExistSignal.Wait(); if (!Active) break; // Setup FD fd_set readfds; fd_set writefds; FD_ZERO(&readfds); FD_ZERO(&writefds); SessionListLock.Lock(); { for (ssit = sss.begin(); ssit != sss.end(); ssit++) { O2SocketSession *ss = *ssit; if (ss->can_send) FD_SET(ss->sock, &writefds); if (ss->can_recv) FD_SET(ss->sock, &readfds); } } SessionListLock.Unlock(); // select struct timeval tv; tv.tv_sec = SELECT_TIMEOUT_MS/1000; tv.tv_usec = SELECT_TIMEOUT_MS%1000; select(0, &readfds, &writefds, NULL, &tv); if (!Active) break; // // 既存セッションとの送受信 // SessionListLock.Lock(); ssit = sss.begin(); SessionListLock.Unlock(); while (Active) { bool end = false; SessionListLock.Lock(); { if (ssit == sss.end()) end = true; } SessionListLock.Unlock(); if (end) break; O2SocketSession *ss = *ssit; // IP文字列 wstring ipstr; if (O2DEBUG) ulong2ipstr(ss->ip, ipstr); else ip2e(ss->ip, ipstr); // Send if (FD_ISSET(ss->sock, &writefds)) { int len; const char *buff = ss->GetNextSend(len); if (len > 0) { int n = send(ss->sock, buff, len, 0); if (n > 0) { ss->UpdateSend(n); ss->UpdateTimer(); SendByte += n; OnSend(ss); if (hwndSetIconCallback) { PostMessage(hwndSetIconCallback, msgSetIconCallback, 1, 0); } } else if (n == 0) { ; } else if ((lasterror = WSAGetLastError()) != WSAEWOULDBLOCK) { if (Logger) { Logger->AddLog(O2LT_NETERR, ClientName.c_str(), ss->ip, ss->port, L"送信エラー(%d)", lasterror); } ss->error = true; ss->Deactivate(); } } } // Recv if (FD_ISSET(ss->sock, &readfds)) { char buff[RECVBUFFSIZE]; int n = recv(ss->sock, buff, RECVBUFFSIZE, 0); if (n > 0) { ss->AppendRecv(buff, n); ss->UpdateTimer(); RecvByte += n; OnRecv(ss); if (hwndSetIconCallback) { PostMessage(hwndSetIconCallback, msgSetIconCallback, 0, 0); } } else if (n == 0) { /*if (Logger) { Logger->AddLog(O2LT_NETERR, ClientName.c_str(), ss->ip, ss->port, L"受信0"); }*/ ss->Deactivate(); } else if ((lasterror = WSAGetLastError()) != WSAEWOULDBLOCK) { if (Logger) { Logger->AddLog(O2LT_NETERR, ClientName.c_str(), ss->ip, ss->port, L"受信エラー(%d)", lasterror); } ss->error = true; ss->Deactivate(); } } // Delete if (ss->CanDelete()) { bool timeout = ss->GetPastTime() >= ss->timeout_s ? true : false; if (!ss->IsActive() || timeout) { if (timeout) { if (Logger) { Logger->AddLog(O2LT_NETERR, ClientName.c_str(), ss->ip, ss->port, L"timeout"); } } closesocket(ss->sock); ss->sock = 0; SessionListLock.Lock(); ssit = sss.erase(ssit); SessionListLock.Unlock(); OnClose(ss); continue; } } Sleep(1); SessionListLock.Lock(); ssit++; SessionListLock.Unlock(); } } // End SessionListLock.Lock(); for (ssit = sss.begin(); ssit != sss.end(); ssit++) { O2SocketSession *ss = *ssit; closesocket(ss->sock); ss->sock = 0; OnClose(ss); } sss.clear(); SessionListLock.Unlock(); }