내가 이것에 대한 적절한 해결책을 알고하지 않습니다.
이 방법을 사용할 수있는 유일한 방법은 이벤트/매개 변수 데이터와 함께 세션 ID를 사용하여 iframe에서 웹 끝점을 핑 (ping)하고 응용 프로그램의 세션 ID를 사용하여 해당 서비스를 폴링하는 것입니다.
나는 이것을 촉진하기 위해 응용 프로그램 내에서 로컬 웹 서버를 호스팅하고 있습니다.
편집 - 내 구현.
내가 발견 한 해결 방법은 iFrame이 URL 매개 변수로 첨부 된 속성 데이터로 가짜 네트워크 요청을하는 것입니다. 그런 다음 가짜 도메인에 대한 요청에 대한 로컬 DNS 캐시 스레드를 수신하고 이름 값 매개 변수를 추출합니다.
UINT CIFrameListener::ListenerThread(LPVOID pParam)
{
THREADPARAM* ts = (THREADPARAM*)pParam;
Util util;
long startScanTime = util.TimeMS();
HINSTANCE dnsApiLib = LoadLibraryA("DNSAPI.dll");
DNS_GET_CACHE_DATA_TABLE dnsGetCacheDataTable = nullptr;
if(dnsApiLib != nullptr) {
dnsGetCacheDataTable = (DNS_GET_CACHE_DATA_TABLE)GetProcAddress(dnsApiLib, "DnsGetCacheDataTable");
}
while(ts->_this->m_running){
int dnsIndex = 0;
// Check DNS
DNSCACHEENTRY entry;
PDNSCACHEENTRY pEntry = &entry;
dnsGetCacheDataTable(pEntry);
pEntry = pEntry->pNext;
while(pEntry != nullptr) {
size_t len = wcslen(pEntry->pszName);
CString domain(pEntry->pszName);
bool allreadyProcessed = false;
for (int i=0; i<ts->_this->messagesSent.size(); i++){
if(domain.Compare(ts->_this->messagesSent[i]) == 0){
allreadyProcessed = true;
}
}
ts->_this->messagesSent.push_back(domain);
if(allreadyProcessed == false){
int end = domain.Find(_T(".infocache.fakedomain.com"));
if(end != -1){
TRACE2(" Domain: %s %d \n", domain, dnsIndex);
int pos = domain.ReverseFind('-');
if(pos != -1){
CString token3 = domain.Mid(pos + 1, end - pos - 1);
domain = domain.Mid(0, pos);
pos = domain.ReverseFind('-');
if(pos != -1){
CString token2 = domain.Mid(pos + 1, domain.GetLength() - pos - 1);
domain = domain.Mid(0, pos);
pos = domain.ReverseFind('-');
if(pos != -1){
CString token1 = domain.Mid(pos + 1, domain.GetLength() - pos - 1);
CString token0 = domain.Mid(0, pos);
int comp = ts->_this->m_session.Compare(token0);
if(comp == 0){
// Notify handler there is a new event.
// notify(token2, token3, token0);
}
}
}
}
dnsIndex++;
}
}
pEntry = pEntry->pNext;
}
Sleep(250);
}
return 1;
}
: 여기
는 DNS 캐시를 읽는 코드 조각입니다