当前位置: 首页 > news >正文

营销型网站建设项目需求表企业网站推广怎么做

营销型网站建设项目需求表,企业网站推广怎么做,棋牌游戏在哪做网站,知名网站制作公司有哪些由于我的需求是短时间内ping多台机子#xff0c;所以需要异步执行#xff0c;微软提供的例子是同步方式的#xff0c;根据微软官方提供的icmpSendEcho2 函数的信息 #xff0c;我需要定义一个空的宏PIO_APC_ROUTINE_DEFINED #xff0c;定义完之后#xff0c;编译又出现…由于我的需求是短时间内ping多台机子所以需要异步执行微软提供的例子是同步方式的根据微软官方提供的icmpSendEcho2 函数的信息 我需要定义一个空的宏PIO_APC_ROUTINE_DEFINED 定义完之后编译又出现“未声明的标识符”最后上网查需要定义两个数据类型。 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);这样就可以编译通过了但需要注意的是你最后需要调用SleepEx你设置的回调函数才会被执行。 下列代码根据微软官方例子改编 #define _WINSOCK_DEPRECATED_NO_WARNINGS #define PIO_APC_ROUTINE_DEFINED//必须要添加在对应的头文件之前或者在VS解决方案的属性-C/C-预处理器里添加 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;//可以不转直接用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)//调用IcmpSendEcho2使用回调的方式时返回ERROR_IO_PENDING是正常的结果并不是错误{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);//没这行代码回调不会被执行printf(全部处理完成。\n);system(pause);return 0; }遇到的问题和解决方式 程序一回调就崩溃 编译没问题回调也调用的但调用完就崩崩在了不知名的位置。后来上网查了看到有说是__stdcall和__cdecl的问题。因为汇编是通过入栈出栈的方式调用函数的在调用函数前把参数压入栈执行call指令才会跳到函数体执行这时函数自己再通过出栈的方式使用参数而__stdcall和__cdecl的区别就是在函数执行完后栈顶的处理方式不同。C/C的函数默认是__cdecl。 __cdecl需要在函数返回之后根据之前压栈的参数去调整栈顶。如下图 __stdcall是函数内部自己根据参数调整栈顶。如下图 也就说遵守__cdecl规定的人A 去写汇编它写的函数并不会在ret时调整栈顶它会在call指令之后加一条指令去调整栈顶让栈顶恢复到调用函数之前。而遵守__stdcall规定的人B 去写汇编它就会在自己的函数里面调整栈顶让栈顶恢复到调用函数之前。而当着两种规定的人A B一起写代码的时候当B用call指令去调用A的函数时由于B默认就A的函数是自己处理去调整栈顶的实际上A并没有所以当函数返回的时候栈顶可能已经不是调用函数之前的栈顶了如果后续从栈顶拿数据进行操作的时候可能就因为操作非法地址崩了。所以现在要做的就是让它ret之后栈顶能恢复到调用之前就行了用什么方式都无所谓。 由于我们使用的不是源文件而是库所以它的指令已经是固定的了如果它是B去写的汇编那我们就要按B的方式去写函数也就是函数声明要加__stdcall同时函数的参数也要保证ret后栈顶能恢复到调用之前就行了。 VS有个调试功能叫反汇编需要看汇编代码的可以在调试-窗口-反汇编但需要代码编译成功并运行的时候才会有。 未定义标识符PIO_APC_ROUTINE 在微软官方文档中没有找到PIO_APC_ROUTINE的定义这定义也是在别人帖子上看到的。根据我们前面讲的我们知道只要函数ret之后栈顶能恢复到call之前就行所以你怎么定义这个PIO_APC_ROUTINE都行只要能让栈顶恢复就不会崩甚至能把参数缩短到两个4个字节8个字节因为它需要将堆栈调整0CH字节。将参数强转也可以根据你的想法去用。回调不执行 它的异步不是完成了就会去执行回调函数而是需要你用SleepEx函数才会执行回调目前只尝试到这种方式可以而且IcmpSendEcho2和SleepEx需要在同一个线程里。所以如果你想它执行回调同时又不想阻塞在某个位置那么只能用其他线程去执行IcmpSendEcho2和SleepEx
http://www.hkea.cn/news/14585019/

相关文章:

  • 深圳网站建设raygf义乌建设局网站
  • 外贸网站定制公司北京展板设计制作公司
  • 广州网站优化公司咨询网站建设分金手指专业十七
  • 可以做猫头像的网站网站如何做微信支付宝支付宝
  • 烟台开发区做网站东莞网站设地
  • 网站建设营销话术网站建设服务8
  • 如何建设网站山东济南兴田德润官网网站制作怎么学
  • 英文阿里巴巴网站建设贵州灵溪seo整站优化
  • wap asp网站模板下载网站怎么建设教程
  • 厦门专业网站推广宽带网络哪家好
  • 坑梓做网站公司怎么样仿糗事百科wordpress
  • 上海做网站公wordpress 七牛
  • 在线制作视频网站开发系统软件
  • 汽车网络营销分析报告宁波seo整体优化
  • 个人网站做经营性小程序项目开发报价
  • 网站怎么做下载网页代码吗室内设计好的大学排名
  • 手机咋做网站最新网站模板
  • 网站设计简单讲解洛阳建设局网站
  • 扁平图标网站wordpress安装要求
  • 在电脑新建网站站点嘉定房产网
  • 网站建设需要哪些流程广告vi设计是什么
  • 网站建设与网页设计专业的semrush
  • 网站空间后台密码成都网站搭建公司
  • 养殖网站 模板外贸做的社交网站
  • 导航网站php下载手机版app
  • 建立网站怎么申请流程平台
  • 网站下拉菜单html做多大选择建设网站公司要注意什么
  • excel做网站页面布局青岛百度网站排名
  • 龙岗网站建设价格建个网站多少费用
  • 换模板搭建网站怎么做品牌市场营销策略