Bug(1)
程序要求:内网之间客户端截屏(.bmp)并传送给服务端。
server:
- #include <winsock2.h> // 为了使用Winsock API函数
- #include <stdio.h>
- #include <windows.h>
- #include<fstream>
- using namespace std;
- // 告诉连接器与WS2_32库连接
- #pragma comment(lib,"WS2_32.lib")
- DWORD rem=,num=;
- void stranl(char *_str)
- {
- char _rem[];
- char _num[];
- int i,j=;
- for(i=;_str[i]!='#';i++)
- {
- _num[i]=_str[i];
- }
- _num[i]='\0';
- i++;
- for(;_str[i]!='\0';i++)
- {
- _rem[j]=_str[i];
- j++;
- }
- _rem[j]='\0';
- num=atoi(_num);
- rem=atoi(_rem);
- }
- int main(int argc, char* argv[])
- {
- // 初始化WS2_32.dll
- WSADATA wsaData;
- WORD sockVersion = MAKEWORD(, );
- ::WSAStartup(sockVersion, &wsaData);
- // 创建套节字
- SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if(s == INVALID_SOCKET)
- {
- printf("Failed socket() \n");
- ::WSACleanup();
- return ;
- }
- // 填充sockaddr_in结构
- sockaddr_in sin;
- sin.sin_family = AF_INET;
- sin.sin_port = htons();
- sin.sin_addr.S_un.S_addr = INADDR_ANY;
- // 绑定这个套节字到一个本地地址
- if(::bind(s, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
- {
- printf("Failed bind() \n");
- ::WSACleanup();
- return ;
- }
- // 进入监听模式
- if(::listen(s, ) == SOCKET_ERROR)
- {
- printf("Failed listen()");
- ::WSACleanup();
- return ;
- }
- // 循环接受客户的连接请求
- sockaddr_in remoteAddr;
- int nAddrLen = sizeof(remoteAddr);
- SOCKET client;
- char szCmd[];
- char szNumRem[];
- int i;
- char block[];
- int BlkSize=,allNum=;
- char *allData=NULL;
- DWORD BmpSize=;
- int nSize=;
- while(TRUE)
- {
- // 接受一个新连接
- client = ::accept(s, (SOCKADDR*)&remoteAddr, &nAddrLen);
- if(client == INVALID_SOCKET)
- {
- printf("Failed accept()");
- continue;
- }
- printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
- while()
- {
- printf("请输入命令:\n");
- scanf("%s",szCmd);
- //分析命令
- if(!=strcmp(szCmd,"q")) //如果不是退出命令,则:
- {
- if(==strcmp(szCmd,"scrshot")) // 如果是截屏命令,则:
- {
- // 向客户端发送命令,让其做好准备
- ::send(client, szCmd, strlen(szCmd), );
- nSize = ::recv(client, szNumRem, , );
- if(nSize > )
- {
- szNumRem[nSize]='\0';
- //解析字符串
- printf("字符串:%s,大小:%d\n",szNumRem,nSize);
- stranl(szNumRem);
- printf("次数:%d,余数:%d\n",num,rem);
- BmpSize=num*+rem;
- allData = new char[BmpSize];
- }
- printf("输入开始命令:");
- scanf("%s",szCmd);
- ::send(client, szCmd, strlen(szCmd), );
- for(i=;i<num;i++)
- {
- BlkSize = ::recv(client, block, , );
- //if(BlkSize==1024)
- if()
- {
- memcpy(allData+*i,block,);
- }
- else
- {
- printf("我擦!\n");
- system("pause");
- }
- }
- BlkSize = ::recv(client, block, , );
- if(BlkSize==rem)
- {
- memcpy(allData+*i,block,rem);
- }
- ofstream of("ClicentScreenShot.bmp",ios_base::binary);
- of.write(allData,BmpSize);
- printf("已完全接收图片!\n");
- }
- }
- else
- break;
- }
- // 关闭同客户端的连接
- ::closesocket(client);
- }
- // 关闭监听套节字
- ::closesocket(s);
- // 释放WS2_32库
- ::WSACleanup();
- return ;
- }
client:
- #include <winsock2.h> // 为了使用Winsock API函数
- #include <stdio.h>
- #include <windows.h>
- #include<fstream>
- using namespace std;
- // 告诉连接器与WS2_32库连接
- #pragma comment(lib,"WS2_32.lib")
- char *allData=NULL;
- DWORD BmpSize=;
- int main(int argc, char* argv[])
- {
- // 初始化WS2_32.dll
- WSADATA wsaData;
- WORD sockVersion = MAKEWORD(, );
- ::WSAStartup(sockVersion, &wsaData);
- // 创建套节字
- SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if(s == INVALID_SOCKET)
- {
- printf("Failed socket() \n");
- ::WSACleanup();
- return ;
- }
- // 也可以在这里调用bind函数绑定一个本地地址
- // 否则系统将会自动安排
- // 填写远程地址信息
- sockaddr_in servAddr;
- servAddr.sin_family = AF_INET;
- servAddr.sin_port = htons();
- // 注意,这里要填写服务器程序(10ServerDemo程序)所在机器的IP地址
- // 如果你的计算机没有联网,直接使用127.0.0.1即可
- servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
- if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -)
- {
- printf("Failed connect() \n");
- ::WSACleanup();
- return ;
- }
- // 接收命令
- char szCmdBuff[];
- char str[];
- char tmp[];
- int i,j;
- char block[];
- int nRecv = ::recv(s, szCmdBuff, , );
- if(nRecv > )
- {
- szCmdBuff[nRecv] = '\0';
- printf("接收到命令:%s\n", szCmdBuff);
- }
- //命令处理
- if(==strcmp(szCmdBuff,"scrshot"))
- {
- //截屏,并计算图像大小
- _ScreenSnap();
- //每次发送1024字节,计算发送次数及剩余字节数
- //格式: 次数#余数
- DWORD rem=BmpSize%;
- DWORD num=BmpSize/;
- itoa(num,str,);
- strcat(str,"#");
- itoa(rem,tmp,);
- strcat(str,tmp);
- printf("字符串:%s\n",str);
- ::send(s, str, strlen(str), );
- ::recv(s, szCmdBuff, , );
- if(==strcmp(szCmdBuff,"start"))
- {
- for(i=;i<num;i++)
- {
- for(j=;j<;j++)
- block[j]=allData[i*+j];
- ::send(s,block,,);
- }
- for(j=;j<rem;j++)
- block[j]=allData[num*+j];
- ::send(s,block,num,);
- }
- }
- // 关闭套节字
- ::closesocket(s);
- // 释放WS2_32库
- ::WSACleanup();
- return ;
- }
结果:
Bug(1)的更多相关文章
- Tomcat一个BUG造成CLOSE_WAIT
之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...
- a标签点击跳转失效--IE6、7的奇葩bug
一般运用a标签包含img去实现点击图片跳转的功能,这是前端经常要用到的东西. 今天遇到个神奇的bug:如果在img上再包裹一层div,而且div设置了width和height,则图片区域点击时,无任何 ...
- 关于 Chrome 浏览器中 onresize 事件的 Bug
我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...
- Chrome出了个小bug:论如何在Chrome下劫持原生只读对象
Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...
- 一个粗心的Bug,JSON格式不规范导致AJAX错误
一.事件回放 今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...
- 了不起的 nodejs-TwitterWeb 案例 bug 解决
了不起的nodejs算是一本不错的入门书,不过书中个别案例存在bug,按照书中源码无法做出和书中相同效果,原本兴奋的心情掺杂着些许失落. 现在我们看一下第七章HTTP,一个Twitter Web客户端 ...
- 应该是Angular2的一个bug?
为了应对未来的趋势,及时赶上下一趟互联网技术,我最近也在通过具体项目研究angular2,首先必须要吐槽的是,学习angular2的成本本身不高,但是一堆的工具.配置实在让人 很是焦灼,就像asp.n ...
- 记录一次bug解决过程:数据迁移
一 总结 不擅长语言表达,勤于沟通,多锻炼 调试MyBatis中SQL语法:foreach 问题:缺少关键字VALUES.很遗憾:它的错误报的让人找不着北. 二 BUG描述:MyBatis中批量插入数 ...
- 关于MJRefresh的下拉加载数据bug
当没有更多数据的时候显示NoMoreData 我的理解是先结束刷新再显示没有更多 今天之前一直没发现有问题 贴之前的代码 [self.collectionView reloadData]; [self ...
- [异常特工]android常见bug跟踪
前言 对app的线上bug的收集(友盟.云捕等)有时会得到这样的异常堆栈信息:没有一行代码是有关自身程序代码的.这使得对bug的解决无从下手,根据经验,内存不足OOM,Dialog关闭,ListVie ...
随机推荐
- redisTemplate注入为空
springboot2.*集成redis时,redis工具类中的redisTemplate注入后总是为空. 问题代码还原: 1.工具类定义成静态工具类,@Resource注入redisTemplate ...
- springcloud微服务架构搭建入门笔记
注册管理服务器 应用入口配置 @SpringBootApplication @EnableEurekaServer public class GatewayApplication { public s ...
- IO流常用模式
主要运用2个设计模式,适配器和装饰者模式.
- 【转】在C#中?,?:和??
符号:?名称:可空类型修饰符.引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; 是正确的,int i=null; 编译器就会报错.为了使值类型 ...
- oracle常用密令大全
1.create user username identified by password;//建用户名和密码oracle ,oracle 2.grant connect,resource,dba t ...
- hdfs 删除和新增节点
最近发现hdfs的一个问题,每当集群开启的时候,有一个节点上的可用空间就一直在减少,并且速度很快,发现是data目录下的dncp_block_verification.log.curr文件在一直变大, ...
- MyBatis整体架构
Mybatis整体架构 基础支持层 反射模块 Java中的反射很强大,但是还是需要封装的.MyBatis专门提供了反射模块,对元素的反射进行了封装,提供了简洁的API,对反射进行了优化,例如缓存了类的 ...
- Python 中 使用 HTMLTestRunner 模块生成测试报告
使用 HTMLTestRunner 模块可以生成测试报告,但是系统自带的报告不详细,不好看,所以找了一份详细的报告 HTMLTestRunner 模板,直接导入就能使用 两种方法生成HTML报告,都 ...
- 【转】TransactionScope事务处理方法介绍及.NET Core中的注意事项
什么是TransactionScope呢? TransactionScope作为System.Transactions的一部分被引入到.NET 2.0.同时SqlClient for .NET Cor ...
- UVA 11992 懒惰标记应用
这个题目要求和 还有 设置区间值 区间增值,明显要用线段树来 由于行数不超过20 而列数多达 10^5,所以对每一行建一棵线段树. 然后主要是在懒惰标记方面是难点 针对两种操作 分别设置 set 和 ...