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 ...
随机推荐
- CAN网络上新增加的设备与网络上已有设备MAC地址冲突的软件解决方案
已知 1号的CAN节点的地址是0x1f 2号的CAN 节点的地址是0x1f 要达到的要求是 假设 网络上 CAN1 节点已经工作了,我现在需要在网络上接入CAN2节点. 那么CAN2节点首次上电的时候 ...
- ADLS_pppoe 基本设置过程
ADLS_pppoe 设置: ①:开启接口的PPPoe功能——pppoe enable ②:指明接口是拨号池1的成员——pppo-client dial-pool-number ③:创建一个逻辑上的拨 ...
- require(): open_basedir restriction in effect. File(/www/wwwroot/xcx/zerg/thinkphp/start.php) is not within the allowed path(s): (/www/wwwroot/xcx/zerg/public/:/tmp/:/proc/) in /www/wwwroot/xcx/zerg/p
解决方法: 在如下文件增加一项(如图所示) 在如下文件增加一项(如图所示): #php文件采用fastcgi解析并设置参数 location ~ \.php { try_files ...
- PHP数据库基础(简单的)
经常用到的函数 $link=mysql_connect("数据库地址","用户名","密码");//链接数据库mysql_query(“se ...
- “战疫”需求不再等-京东云与AI【应急资源信息发布平台】召集开发者共同支援
截止北京时间 2020年2月5日19时00分,全国确诊新型冠状病毒肺炎24423例,疑似23260例. 新年伊始,一切都显得和往年有那么一点不一样.疫情牵动着每一个人的心脏,也有很多人早就放弃了假期投 ...
- C语言-存储类&作用域&生命周期&链接属性
1.概念解析(1)存储类 a.存储类就是存储类型,也就是描述C语言变量在何种地方存储. b.内存有多种管理办法:栈.堆.数据段.bss段..text段......一个变量的存储类属性就是描述这个变量存 ...
- JS - 局部方法改变全局变量的值
var a = "" function aa() { a="卡卡" } aa() // 注意,aa() 一定要执行,局部赋值全局变量才会有作用 aler ...
- WebFlux系列(十二)MongoDB应用,新增、修改、查询、删除
#Java#Spring#SpringBoot#Mongo#reactor#webflux#数据库#新增#修改#查询#删除# Spring Boot WebFlux Mongo数据库新增.删除.查询. ...
- Python属性和内建属性
属性property 1. 私有属性添加getter和setter方法 class Money(object): def __init__(self): self.__money = 0 def ge ...
- 二十八、CI框架之自己写分页类,符合CI的路径规范
一.参照了CSDN上某个前辈写的一个CI分页类,自己删删改改仿写了一个类似的分页类,代码如下: 二.我们在模型里面写2个数据查询的函数,一个用于查询数据数量,一个用于查询出具体数据 三.我们在控制器里 ...