中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

私彩票網(wǎng)站建設(shè)網(wǎng)站seo優(yōu)化排名

私彩票網(wǎng)站建設(shè),網(wǎng)站seo優(yōu)化排名,營銷培訓(xùn)心得,網(wǎng)站建設(shè)申請書由于我的需求是短時間內(nèi)ping多臺機子,所以需要異步執(zhí)行,微軟提供的例子是同步方式的,根據(jù)微軟官方提供的icmpSendEcho2 函數(shù)的信息 ,我需要定義一個空的宏P(guān)IO_APC_ROUTINE_DEFINED ,定義完之后,編譯又出現(xiàn)…

由于我的需求是短時間內(nèi)ping多臺機子,所以需要異步執(zhí)行,微軟提供的例子是同步方式的,根據(jù)微軟官方提供的icmpSendEcho2 函數(shù)的信息
在這里插入圖片描述
,我需要定義一個空的宏PIO_APC_ROUTINE_DEFINED ,定義完之后,編譯又出現(xiàn)“未聲明的標(biāo)識符”,最后上網(wǎng)查需要定義兩個數(shù)據(jù)類型。

typedef struct _IO_STATUS_BLOCK{union {long Status;void *  Pointer;};unsigned long *Information;
} IO_STATUS_BLOCK, * PIO_STATUS_BLOCK;typedef void (__stdcall* PIO_APC_ROUTINE) (void* ApcContext, PIO_STATUS_BLOCK IoStatusBlock, unsigned long Reserved);

這樣就可以編譯通過了,但需要注意的是你最后需要調(diào)用SleepEx,你設(shè)置的回調(diào)函數(shù)才會被執(zhí)行。

下列代碼根據(jù)微軟官方例子改編

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define PIO_APC_ROUTINE_DEFINED//必須要添加在對應(yīng)的頭文件之前,或者在VS解決方案的屬性->C/C++->預(yù)處理器里添加
typedef
struct _IO_STATUS_BLOCK {union {long Status;void* Pointer;};unsigned long* Information;
} IO_STATUS_BLOCK, * PIO_STATUS_BLOCK;
typedef
void
(__stdcall* PIO_APC_ROUTINE) (void* ApcContext,PIO_STATUS_BLOCK IoStatusBlock,unsigned long Reserved);
#include <winsock2.h>
#include <iphlpapi.h>
#include <icmpapi.h>
#include <stdio.h>#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")int CALLBACK ReplyCame(PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, ULONG Reserved)
{//char* szAddr = (char*)ApcContext;//可以不轉(zhuǎn),直接用ApcContext去打印printf("Replay Came for %s...... \n", ApcContext);g_bReply = TRUE;return 0;
}int __cdecl main(int argc, char** argv)
{HANDLE hIcmpFile;unsigned long ipaddr = INADDR_NONE;DWORD dwRetVal = 0;DWORD dwError = 0;char SendData[] = "Data Buffer";LPVOID ReplyBuffer = NULL;DWORD ReplySize = 0;char csIP[] = "192.168.1.103";ipaddr = inet_addr(csIP);if (ipaddr == INADDR_NONE) {printf("usage: %s IP address\n", csIP);return 1;}hIcmpFile = IcmpCreateFile();if (hIcmpFile == INVALID_HANDLE_VALUE) {printf("\tUnable to open handle.\n");printf("IcmpCreatefile returned error: %ld\n", GetLastError());return 1;}// Allocate space for at a single replyReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData) + 8;ReplyBuffer = (VOID*)malloc(ReplySize);if (ReplyBuffer == NULL) {printf("\tUnable to allocate memory for reply buffer\n");return 1;}dwRetVal = IcmpSendEcho2(hIcmpFile, NULL, (PIO_APC_ROUTINE)ReplyCame, NULL,ipaddr, SendData, sizeof(SendData), NULL,ReplyBuffer, ReplySize, 1000);if (dwRetVal != 0) {PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer;struct in_addr ReplyAddr;ReplyAddr.S_un.S_addr = pEchoReply->Address;printf("\tSent icmp message to %s\n", argv[1]);if (dwRetVal > 1) {printf("\tReceived %ld icmp message responses\n", dwRetVal);printf("\tInformation from the first response:\n");}else {printf("\tReceived %ld icmp message response\n", dwRetVal);printf("\tInformation from this response:\n");}printf("\t  Received from %s\n", inet_ntoa(ReplyAddr));printf("\t  Status = %ld  ", pEchoReply->Status);switch (pEchoReply->Status) {case IP_DEST_HOST_UNREACHABLE:printf("(Destination host was unreachable)\n");break;case IP_DEST_NET_UNREACHABLE:printf("(Destination Network was unreachable)\n");break;case IP_REQ_TIMED_OUT:printf("(Request timed out)\n");break;default:printf("\n");break;}printf("\t  Roundtrip time = %ld milliseconds\n",pEchoReply->RoundTripTime);}else {dwError = GetLastError();if (dwError != ERROR_IO_PENDING)//調(diào)用IcmpSendEcho2使用回調(diào)的方式時,返回ERROR_IO_PENDING是正常的結(jié)果,并不是錯誤{printf("Call to IcmpSendEcho2 failed.\n");switch (dwError) {case IP_BUF_TOO_SMALL:printf("\tReplyBufferSize too small\n");break;case IP_REQ_TIMED_OUT:printf("\tRequest timed out\n");break;default:printf("\tExtended error returned: %ld\n", dwError);break;}return 1;}}SleepEx(1000, TRUE);//沒這行代碼回調(diào)不會被執(zhí)行printf("全部處理完成。\n");system("pause");return 0;
}

遇到的問題和解決方式:

  • 程序一回調(diào)就崩潰
    編譯沒問題,回調(diào)也調(diào)用的,但調(diào)用完就崩,崩在了不知名的位置。后來上網(wǎng)查了,看到有說是__stdcall和__cdecl的問題。因為匯編是通過入棧出棧的方式調(diào)用函數(shù)的,在調(diào)用函數(shù)前,把參數(shù)壓入棧,執(zhí)行call指令才會跳到函數(shù)體執(zhí)行,這時函數(shù)自己再通過出棧的方式使用參數(shù),而__stdcall和__cdecl的區(qū)別就是在函數(shù)執(zhí)行完后棧頂?shù)奶幚矸绞讲煌?。C/C++的函數(shù)默認是__cdecl。

__cdecl需要在函數(shù)返回之后,根據(jù)之前壓棧的參數(shù)去調(diào)整棧頂。如下圖
在這里插入圖片描述

__stdcall是函數(shù)內(nèi)部自己根據(jù)參數(shù)調(diào)整棧頂。如下圖
在這里插入圖片描述

也就說遵守__cdecl規(guī)定的人A 去寫匯編,它寫的函數(shù)并不會在ret時調(diào)整棧頂,它會在call指令之后,加一條指令去調(diào)整棧頂,讓棧頂恢復(fù)到調(diào)用函數(shù)之前。而遵守__stdcall規(guī)定的人B 去寫匯編,它就會在自己的函數(shù)里面調(diào)整棧頂,讓棧頂恢復(fù)到調(diào)用函數(shù)之前。而當(dāng)著兩種規(guī)定的人A B一起寫代碼的時候,當(dāng)B用call指令去調(diào)用A的函數(shù)時,由于B默認就A的函數(shù)是自己處理去調(diào)整棧頂?shù)?#xff0c;實際上A并沒有,所以當(dāng)函數(shù)返回的時候,棧頂可能已經(jīng)不是調(diào)用函數(shù)之前的棧頂了,如果后續(xù)從棧頂拿數(shù)據(jù)進行操作的時候,可能就因為操作非法地址崩了。所以現(xiàn)在要做的就是讓它ret之后,棧頂能恢復(fù)到調(diào)用之前就行了,用什么方式都無所謂。
由于我們使用的不是源文件,而是庫,所以它的指令已經(jīng)是固定的了,如果它是B去寫的匯編,那我們就要按B的方式去寫函數(shù),也就是函數(shù)聲明要加__stdcall,同時函數(shù)的參數(shù)也要保證ret后,棧頂能恢復(fù)到調(diào)用之前就行了。
VS有個調(diào)試功能叫反匯編,需要看匯編代碼的,可以在調(diào)試->窗口->反匯編,但需要代碼編譯成功并運行的時候才會有。

  • 未定義標(biāo)識符PIO_APC_ROUTINE
    在微軟官方文檔中沒有找到PIO_APC_ROUTINE的定義,這定義也是在別人帖子上看到的。根據(jù)我們前面講的,我們知道只要函數(shù)ret之后,棧頂能恢復(fù)到call之前就行,所以你怎么定義這個PIO_APC_ROUTINE都行,只要能讓棧頂恢復(fù)就不會崩,甚至能把參數(shù)縮短到兩個(4個字節(jié)+8個字節(jié)),因為它需要將堆棧調(diào)整0CH字節(jié)。將參數(shù)強轉(zhuǎn),也可以根據(jù)你的想法去用。
  • 回調(diào)不執(zhí)行
    它的異步不是完成了就會去執(zhí)行回調(diào)函數(shù),而是需要你用SleepEx函數(shù)才會執(zhí)行回調(diào)(目前只嘗試到這種方式可以),而且IcmpSendEcho2和SleepEx需要在同一個線程里。所以,如果你想它執(zhí)行回調(diào),同時又不想阻塞在某個位置,那么只能用其他線程去執(zhí)行IcmpSendEcho2和SleepEx
http://www.risenshineclean.com/news/48485.html

相關(guān)文章:

  • 做模具的網(wǎng)站seo智能優(yōu)化
  • wordpress用戶排行榜廈門seo服務(wù)
  • 做亞馬遜網(wǎng)站費用嗎必應(yīng)收錄提交入口
  • 一個網(wǎng)站可以做多少個關(guān)鍵詞百度網(wǎng)頁排名怎么提升
  • wordpress首頁截斷seo白帽優(yōu)化
  • php動態(tài)網(wǎng)站開發(fā)簡介網(wǎng)站制作平臺
  • 自己怎么做系統(tǒng)網(wǎng)站能打開的a站
  • 共享辦公室 設(shè)計網(wǎng)站性能優(yōu)化
  • 鐵漢生態(tài)建設(shè)有限公司網(wǎng)站最新黑帽seo培訓(xùn)
  • 如何做屬于自己的領(lǐng)券網(wǎng)站廈門人才網(wǎng)最新招聘信息
  • 越南做企業(yè)網(wǎng)站百度云電腦版網(wǎng)站入口
  • 廣寧縣住房和城鄉(xiāng)建設(shè)局網(wǎng)站seo優(yōu)化標(biāo)題 關(guān)鍵詞
  • 一個網(wǎng)站多個域名重定向怎么做南京搜索引擎推廣優(yōu)化
  • 響應(yīng)式網(wǎng)站建設(shè)團隊全網(wǎng)天下網(wǎng)站開發(fā)制作培訓(xùn)學(xué)校
  • 怎么做婚戀網(wǎng)站百度收錄是什么意思
  • 跨境電商網(wǎng)站建設(shè)方案網(wǎng)站優(yōu)化排名易下拉穩(wěn)定
  • 附近網(wǎng)站建設(shè)公司哪家好注冊網(wǎng)站免費注冊
  • 要找企業(yè)做網(wǎng)站應(yīng)該注意什么網(wǎng)站優(yōu)化外包推薦
  • 河源建設(shè)用地競拍網(wǎng)站2024年新冠疫情最新消息今天
  • 信息網(wǎng)站建設(shè)預(yù)算windows優(yōu)化大師和360哪個好
  • 怎么在自己電腦上建網(wǎng)站今日競彩足球最新比賽結(jié)果查詢
  • 營銷系統(tǒng)有哪些南昌seo排名外包
  • 網(wǎng)站主頁模板友情鏈接檢測平臺
  • 建一家網(wǎng)站多少錢濰坊網(wǎng)站建設(shè)方案咨詢
  • 游戲類網(wǎng)頁設(shè)計優(yōu)化推廣
  • 網(wǎng)站建設(shè)設(shè)計時代創(chuàng)信好找廣告商的平臺
  • 企業(yè)網(wǎng)站平臺如何做網(wǎng)絡(luò)推廣視頻剪輯培訓(xùn)
  • 網(wǎng)站備案主體查詢河南seo優(yōu)化
  • 網(wǎng)絡(luò)規(guī)劃設(shè)計師2022云優(yōu)化
  • 怎做賣東西的網(wǎng)站如何快速網(wǎng)絡(luò)推廣