当前位置: 首页 > 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/14431318/

相关文章:

  • 建材网站素材discuz模板制作教程
  • 网站后台更新了 前台不现实pc端百度
  • 浅谈国内高校英文网站的建设现状如果网站设计时
  • 软件制作公司专注于上海seo做网站建设
  • 筹备网站建设软件开发入门
  • 手机网站开发 视频太原百度seo排名
  • 域名备案关闭网站吗网站开发外包业务怎么接
  • 邙山郑州网站建设网站关键词效果追踪怎么做
  • 永年做网站国家水资源监控能力建设网站
  • 湖州网站建设公司哪家好南通给公司做网站的
  • 甘肃省酒泉市做网站公司北京优秀网站建设
  • 学习网站建设培训网站哪类业务建设投入会带来间接收益
  • 萧山品牌网站建设单位内网网站建设 开设栏目
  • 网页界面设计和素材seo优化的技巧
  • 网站建设和技术服务合同范本在哪里做企业网站
  • php驾校网站源码丽江市企业网站
  • 简述织梦网站上传步骤沈阳城市建设学院官网网站
  • 西安免费做网站价格有哪些线上做酒店的网站
  • 做设计需要素材的常用网站德州市住房建设局网站
  • 怎么改版一个网站win7和WordPress的关系
  • 给女朋友做的网站内容广告设计软件哪个好
  • 青海省教育厅门户网站北京app外包公司哪家好
  • 衡水精品网站建设黑龙江建设部网站
  • 宜兴建设局网站拖拽式wordpress建站
  • 免费网站空间注册万户网站制作
  • 企业网站制作教程视频wordpress 您没有足够的权限
  • 中国咖啡网站建设方案wordpress厨房家居主题
  • 网站建设的栏目内容网页制作步骤图文
  • 网站关键词排名分析seo新站如何快速排名
  • 淘宝上做网站怎么样苏州高端网站定制