程序要求:内网之间客户端截屏(.bmp)并传送给服务端。

server:

  1. #include <winsock2.h> // 为了使用Winsock API函数
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include<fstream>
  5. using namespace std;
  6.  
  7. // 告诉连接器与WS2_32库连接
  8. #pragma comment(lib,"WS2_32.lib")
  9.  
  10. DWORD rem=,num=;
  11. void stranl(char *_str)
  12. {
  13. char _rem[];
  14. char _num[];
  15. int i,j=;
  16. for(i=;_str[i]!='#';i++)
  17. {
  18. _num[i]=_str[i];
  19. }
  20. _num[i]='\0';
  21. i++;
  22. for(;_str[i]!='\0';i++)
  23. {
  24. _rem[j]=_str[i];
  25. j++;
  26. }
  27. _rem[j]='\0';
  28. num=atoi(_num);
  29. rem=atoi(_rem);
  30.  
  31. }
  32. int main(int argc, char* argv[])
  33. {
  34. // 初始化WS2_32.dll
  35. WSADATA wsaData;
  36. WORD sockVersion = MAKEWORD(, );
  37. ::WSAStartup(sockVersion, &wsaData);
  38.  
  39. // 创建套节字
  40. SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  41. if(s == INVALID_SOCKET)
  42. {
  43. printf("Failed socket() \n");
  44. ::WSACleanup();
  45. return ;
  46. }
  47.  
  48. // 填充sockaddr_in结构
  49. sockaddr_in sin;
  50. sin.sin_family = AF_INET;
  51. sin.sin_port = htons();
  52. sin.sin_addr.S_un.S_addr = INADDR_ANY;
  53.  
  54. // 绑定这个套节字到一个本地地址
  55. if(::bind(s, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
  56. {
  57. printf("Failed bind() \n");
  58. ::WSACleanup();
  59. return ;
  60. }
  61.  
  62. // 进入监听模式
  63. if(::listen(s, ) == SOCKET_ERROR)
  64. {
  65. printf("Failed listen()");
  66. ::WSACleanup();
  67. return ;
  68. }
  69.  
  70. // 循环接受客户的连接请求
  71. sockaddr_in remoteAddr;
  72. int nAddrLen = sizeof(remoteAddr);
  73. SOCKET client;
  74. char szCmd[];
  75. char szNumRem[];
  76. int i;
  77. char block[];
  78. int BlkSize=,allNum=;
  79. char *allData=NULL;
  80. DWORD BmpSize=;
  81. int nSize=;
  82. while(TRUE)
  83. {
  84. // 接受一个新连接
  85. client = ::accept(s, (SOCKADDR*)&remoteAddr, &nAddrLen);
  86. if(client == INVALID_SOCKET)
  87. {
  88. printf("Failed accept()");
  89. continue;
  90. }
  91.  
  92. printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
  93. while()
  94. {
  95. printf("请输入命令:\n");
  96. scanf("%s",szCmd);
  97. //分析命令
  98. if(!=strcmp(szCmd,"q")) //如果不是退出命令,则:
  99. {
  100. if(==strcmp(szCmd,"scrshot")) // 如果是截屏命令,则:
  101. {
  102. // 向客户端发送命令,让其做好准备
  103. ::send(client, szCmd, strlen(szCmd), );
  104. nSize = ::recv(client, szNumRem, , );
  105. if(nSize > )
  106. {
  107. szNumRem[nSize]='\0';
  108. //解析字符串
  109. printf("字符串:%s,大小:%d\n",szNumRem,nSize);
  110. stranl(szNumRem);
  111. printf("次数:%d,余数:%d\n",num,rem);
  112. BmpSize=num*+rem;
  113. allData = new char[BmpSize];
  114. }
  115. printf("输入开始命令:");
  116. scanf("%s",szCmd);
  117. ::send(client, szCmd, strlen(szCmd), );
  118. for(i=;i<num;i++)
  119. {
  120. BlkSize = ::recv(client, block, , );
  121. //if(BlkSize==1024)
  122. if()
  123. {
  124. memcpy(allData+*i,block,);
  125. }
  126. else
  127. {
  128. printf("我擦!\n");
  129. system("pause");
  130. }
  131. }
  132. BlkSize = ::recv(client, block, , );
  133. if(BlkSize==rem)
  134. {
  135. memcpy(allData+*i,block,rem);
  136. }
  137. ofstream of("ClicentScreenShot.bmp",ios_base::binary);
  138. of.write(allData,BmpSize);
  139. printf("已完全接收图片!\n");
  140. }
  141. }
  142. else
  143. break;
  144. }
  145. // 关闭同客户端的连接
  146. ::closesocket(client);
  147. }
  148.  
  149. // 关闭监听套节字
  150. ::closesocket(s);
  151. // 释放WS2_32库
  152. ::WSACleanup();
  153.  
  154. return ;
  155. }

client:

  1. #include <winsock2.h> // 为了使用Winsock API函数
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include<fstream>
  5. using namespace std;
  6.  
  7. // 告诉连接器与WS2_32库连接
  8. #pragma comment(lib,"WS2_32.lib")
  9.  
  10. char *allData=NULL;
  11. DWORD BmpSize=;
  12. int main(int argc, char* argv[])
  13. {
  14. // 初始化WS2_32.dll
  15. WSADATA wsaData;
  16. WORD sockVersion = MAKEWORD(, );
  17. ::WSAStartup(sockVersion, &wsaData);
  18.  
  19. // 创建套节字
  20. SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  21. if(s == INVALID_SOCKET)
  22. {
  23. printf("Failed socket() \n");
  24. ::WSACleanup();
  25. return ;
  26. }
  27.  
  28. // 也可以在这里调用bind函数绑定一个本地地址
  29. // 否则系统将会自动安排
  30.  
  31. // 填写远程地址信息
  32. sockaddr_in servAddr;
  33. servAddr.sin_family = AF_INET;
  34. servAddr.sin_port = htons();
  35. // 注意,这里要填写服务器程序(10ServerDemo程序)所在机器的IP地址
  36. // 如果你的计算机没有联网,直接使用127.0.0.1即可
  37. servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  38.  
  39. if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -)
  40. {
  41. printf("Failed connect() \n");
  42. ::WSACleanup();
  43. return ;
  44. }
  45.  
  46. // 接收命令
  47. char szCmdBuff[];
  48. char str[];
  49. char tmp[];
  50. int i,j;
  51. char block[];
  52. int nRecv = ::recv(s, szCmdBuff, , );
  53. if(nRecv > )
  54. {
  55. szCmdBuff[nRecv] = '\0';
  56. printf("接收到命令:%s\n", szCmdBuff);
  57. }
  58. //命令处理
  59. if(==strcmp(szCmdBuff,"scrshot"))
  60. {
  61. //截屏,并计算图像大小
  62. _ScreenSnap();
  63. //每次发送1024字节,计算发送次数及剩余字节数
  64. //格式: 次数#余数
  65. DWORD rem=BmpSize%;
  66. DWORD num=BmpSize/;
  67. itoa(num,str,);
  68. strcat(str,"#");
  69. itoa(rem,tmp,);
  70. strcat(str,tmp);
  71. printf("字符串:%s\n",str);
  72. ::send(s, str, strlen(str), );
  73. ::recv(s, szCmdBuff, , );
  74. if(==strcmp(szCmdBuff,"start"))
  75. {
  76. for(i=;i<num;i++)
  77. {
  78. for(j=;j<;j++)
  79. block[j]=allData[i*+j];
  80. ::send(s,block,,);
  81.  
  82. }
  83. for(j=;j<rem;j++)
  84. block[j]=allData[num*+j];
  85. ::send(s,block,num,);
  86. }
  87. }
  88. // 关闭套节字
  89. ::closesocket(s);
  90. // 释放WS2_32库
  91. ::WSACleanup();
  92. return ;
  93. }

结果:

Bug(1)的更多相关文章

  1. Tomcat一个BUG造成CLOSE_WAIT

    之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...

  2. a标签点击跳转失效--IE6、7的奇葩bug

    一般运用a标签包含img去实现点击图片跳转的功能,这是前端经常要用到的东西. 今天遇到个神奇的bug:如果在img上再包裹一层div,而且div设置了width和height,则图片区域点击时,无任何 ...

  3. 关于 Chrome 浏览器中 onresize 事件的 Bug

    我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...

  4. Chrome出了个小bug:论如何在Chrome下劫持原生只读对象

    Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...

  5. 一个粗心的Bug,JSON格式不规范导致AJAX错误

    一.事件回放  今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...

  6. 了不起的 nodejs-TwitterWeb 案例 bug 解决

    了不起的nodejs算是一本不错的入门书,不过书中个别案例存在bug,按照书中源码无法做出和书中相同效果,原本兴奋的心情掺杂着些许失落. 现在我们看一下第七章HTTP,一个Twitter Web客户端 ...

  7. 应该是Angular2的一个bug?

    为了应对未来的趋势,及时赶上下一趟互联网技术,我最近也在通过具体项目研究angular2,首先必须要吐槽的是,学习angular2的成本本身不高,但是一堆的工具.配置实在让人 很是焦灼,就像asp.n ...

  8. 记录一次bug解决过程:数据迁移

    一 总结 不擅长语言表达,勤于沟通,多锻炼 调试MyBatis中SQL语法:foreach 问题:缺少关键字VALUES.很遗憾:它的错误报的让人找不着北. 二 BUG描述:MyBatis中批量插入数 ...

  9. 关于MJRefresh的下拉加载数据bug

    当没有更多数据的时候显示NoMoreData 我的理解是先结束刷新再显示没有更多 今天之前一直没发现有问题 贴之前的代码 [self.collectionView reloadData]; [self ...

  10. [异常特工]android常见bug跟踪

    前言 对app的线上bug的收集(友盟.云捕等)有时会得到这样的异常堆栈信息:没有一行代码是有关自身程序代码的.这使得对bug的解决无从下手,根据经验,内存不足OOM,Dialog关闭,ListVie ...

随机推荐

  1. redisTemplate注入为空

    springboot2.*集成redis时,redis工具类中的redisTemplate注入后总是为空. 问题代码还原: 1.工具类定义成静态工具类,@Resource注入redisTemplate ...

  2. springcloud微服务架构搭建入门笔记

    注册管理服务器 应用入口配置 @SpringBootApplication @EnableEurekaServer public class GatewayApplication { public s ...

  3. IO流常用模式

    主要运用2个设计模式,适配器和装饰者模式.

  4. 【转】在C#中?,?:和??

    符号:?名称:可空类型修饰符.引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; 是正确的,int i=null; 编译器就会报错.为了使值类型 ...

  5. oracle常用密令大全

    1.create user username identified by password;//建用户名和密码oracle ,oracle 2.grant connect,resource,dba t ...

  6. hdfs 删除和新增节点

    最近发现hdfs的一个问题,每当集群开启的时候,有一个节点上的可用空间就一直在减少,并且速度很快,发现是data目录下的dncp_block_verification.log.curr文件在一直变大, ...

  7. MyBatis整体架构

    Mybatis整体架构 基础支持层 反射模块 Java中的反射很强大,但是还是需要封装的.MyBatis专门提供了反射模块,对元素的反射进行了封装,提供了简洁的API,对反射进行了优化,例如缓存了类的 ...

  8. Python 中 使用 HTMLTestRunner 模块生成测试报告

     使用 HTMLTestRunner 模块可以生成测试报告,但是系统自带的报告不详细,不好看,所以找了一份详细的报告 HTMLTestRunner 模板,直接导入就能使用 两种方法生成HTML报告,都 ...

  9. 【转】TransactionScope事务处理方法介绍及.NET Core中的注意事项

    什么是TransactionScope呢? TransactionScope作为System.Transactions的一部分被引入到.NET 2.0.同时SqlClient for .NET Cor ...

  10. UVA 11992 懒惰标记应用

    这个题目要求和 还有 设置区间值 区间增值,明显要用线段树来 由于行数不超过20 而列数多达 10^5,所以对每一行建一棵线段树. 然后主要是在懒惰标记方面是难点 针对两种操作 分别设置 set 和 ...