惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
B
Blog RSS Feed
宝玉的分享
宝玉的分享
腾讯CDC
博客园_首页
T
Tailwind CSS Blog
月光博客
月光博客
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
M
MIT News - Artificial intelligence
A
About on SuperTechFans
云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
有赞技术团队
有赞技术团队
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
大猫的无限游戏
大猫的无限游戏
MongoDB | Blog
MongoDB | Blog
博客园 - 聂微东
V
Visual Studio Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
SecWiki News
SecWiki News
美团技术团队
P
Privacy International News Feed
H
Help Net Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Microsoft Security Blog
Microsoft Security Blog
Know Your Adversary
Know Your Adversary
Y
Y Combinator Blog
D
DataBreaches.Net
Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
Cyberwarzone
Cyberwarzone
C
Cybersecurity and Infrastructure Security Agency CISA
C
Cisco Blogs
S
Schneier on Security
G
GRAHAM CLULEY
博客园 - 三生石上(FineUI控件)
Cisco Talos Blog
Cisco Talos Blog
小众软件
小众软件
Forbes - Security
Forbes - Security
D
Docker
T
Tenable Blog
S
Secure Thoughts
雷峰网
雷峰网
S
Security @ Cisco Blogs
T
The Exploit Database - CXSecurity.com
The Cloudflare Blog
博客园 - 【当耐特】
Spread Privacy
Spread Privacy
阮一峰的网络日志
阮一峰的网络日志

博客园 - Kevin Wu

你是否也爱车 Asp..net 页面间跳转方法 Windows Server 2008 RC0正式发布、下载 通过Url抓取网页内容 如何生成静态页面的五种方案 (转)怎样用dos入侵局域网 闲里偷忙 [导入]学习网页制作: 用CSS来控制网页背景 (转)解决AJAX中使用UpdatePanel后再用Response.Write();等无法弹出对话框问题 3法 为你的aspx页面加上ajax enable - Kevin Wu 几种保持页面状态信息的讨论(转) 在Windows Servrer 2003下安装UDDI服务和UDDI .NET SDK JDK1.5+Tomcat5+MySql+Juddi 架设UDDI服务器 拒绝了对对象 'xp_cmdshell'(数据库 'master',所有者 'dbo')的 EXECUTE 权限 解决方法 无法将类型“ASP.login_aspx”转换为“System.Web.UI.WebControls.Login” 错误处理 终于考完试了~~~ 远程控制(3) 关于windows hook的提问 远程控制(1)
远程控制(2)
Kevin Wu · 2007-01-01 · via 博客园 - Kevin Wu

二.接收

上面已经讲到如何将数据包发送出去,剩下的就是接收,和控制
既然发送端是用upd发送,那么接收端当然也是用udp接收(好多废话哦)

简单点,用个循环将接收到的包按包号写入内存,然后在内存中读取数据,还原图片,具体步骤如下:

接收包-->按包号计算偏移-->接收到最后一个包-->写入-->还原图片-->显示
          |          |
      写入内存(循环)     

很简单是吧,假如要考虑到其他的问题的话,那么就会复杂一点,上面所有动作将放在一个单独线程执行

  (1)接收包

   IPEndPoint hostPoint = new IPEndPoint(IPAddress.Any, 0);
Byte[] recv = ReceClient.Receive(ref hostPoint);

UdpClient的Receive是总是阻塞的,直到有数据包的到来,接受到字节后,还要进行分解,上面漏了一步,根据我们发包的内容,我们可以知道包内各个位置放着的是什么数据
0-3     包号
4-?     包内容
?-end 包内容长度

为什么用?呢,这个就关系到这个数据包的设计问题了.现在想想真的是一大失败.由于包内容的长度不一定是固定的,包内容长度用来描述包内容长度,在读取的时候就有点麻烦,如下

for (int i = 0; i < 4; i++)
{
    Num[i] 
= recv[i];
    length[i] 
= recv[recv.Length - 4 + i];
}

每次都要用包长度-4来获取包内容长度.假如开始我们的数据包设置成

        struct ImageBlock
        
{
            
public int Num;           
                public int ContentLen;
            
public Byte[] Content;
        }

那么就会好很多
0-3     包号
4-7     包内容长度
7-end 包内容

获取包号和长度之后,就可以写入内存中相应的位置了.
计算?    

MemoryStream iStream = new MemoryStream();
iStream.Position 
= block.Num * 2040;
   iStream.Write(block.Content, 0, block.ContentLen);

一般来说,只要不是最后一个包的话,每包数据量都是2040,所以......虽然我觉得有点汗,但是还是这样处理算了.同时还有一个问题,udp包按顺序发,但不一定是按顺序接收.先看看这里

if (block.Num == -1)
{
        Image memoryImage 
= new Bitmap(iStream);
        ImagePanel.BackgroundImage 
= memoryImage;
 }

记得上次发包的时候将最后一个包包号写成-1 吧,假如这个包在其他包接收到之前就已经被接收,那么内存中的数据就会立刻被转成图片,并且显示.那么后来来到的那些包呢(我指同一张图片的),没有丢,也接收了,不过已经失去了意义.虽然在局域网里这个情况不是很明显,但是在internet上的话,就很大问题了.所以用udp还是有那么一点痛苦.所以,我们可以改用tcp了(面向连接),顺序就不会搞错,耗点资源也值得.同时也有其他的一些方法,用udp也能够完成类似tcp的任务,我还没弄,只是知道有,就不介绍了

到这里,一张图片的接收就完成了,怎么显示?对哦,还没说.....我用的是panel.  ImagePanel.BackgroundImage.很简单吧.在显示之前,要设置好panel大小,意思就是获得对方屏幕的大小,怎么做就不说了,和上面说的一样.传~~~~
获取屏幕大小的方法:
Screen.AllScreens[0].Bounds.Size;
假如对方有多个显示器的话......那...一般都是一个啦.....0就是第一个

好,有画面显示了.下面就开始控制

友情提示:
如需转载本文,请遵守"本站协议"并加入下面声明 且注明原文链接。
作者:kevin wu
来源:kevin wu's corner