zoukankan      html  css  js  c++  java
  • 自建Socket转发,使用远程桌面(mstsc)连接家中电脑

    网络结构图如下:

    网络示意图

    开题先放图,一切全靠编哈哈。

    进入正题!

    如图所示,我们需要一个公网服务器,利用公网服务器将内网的数据进行转发,从而实现两个内网服务器的通讯。没错,这不是p2p,原本想做成p2p,因为有点难度,所以先弄一个tcp数据包转发,后面再来打洞进行p2p连接。

    开发环境

    VS2017 + asp net core2.1 +  .net framework 4.5

    整个过程是如何实现的呢?

    1.被控客户端启动,发送被控端名称,例如:Home

    2.服务器接收到被控端的数据,将Home记录,并将Home绑定到当前Tcp连接

    3.主控端启动,发送要连接的“被控端服务”名称,例如:Home

    4.服务端接收到主控端的请求,查询Home对应的Tcp连接

    5.将从主控端来的数据转发到被控端,将被控端来的数据转发到主控端

    代码在哪?

    放到github上了:https://github.com/bobowire/Wireboy.Socket.P2PService

    在实现的过程中遇到什么问题了?

    1.由于windows锁屏后,Console.WriteLine方法会进行无限期等待,导致程序卡住不动。

    解决办法:在运行后,将所有的Console.WriteLine方法全部注释掉了。

    2.在连接一次之后,再次连接会因为接收函数的超时时间太长,导致后面连接失败

    解决办法:增加守护线程,在进行数据传输后,开启守护线程,一旦数据传输发生超时,启动新的tcp连接进行通讯。为什么不用自带的超时?嗯,那时候没想到这个东西。

    讲解一下代码吧?

    代码很简单,主要是用的TcpClient和TcpListener两个类,利用Dictionary绑定Tcp连接与服务名称,所以只允许一台电脑连接被控端。如此一来,被控端的断线重连对数据的转发影响就不大了。

    TcpListener类用于监听本地端口。

    TcpClient类用于转发数据。

    怎么使用?

    请查看项目MD文件:https://github.com/bobowire/Wireboy.Socket.P2PService

    运行效果图

  • 相关阅读:
    接口设计安全
    PHP通过OpenSSL生成证书、密钥并且加密解密数据,以及公钥,私钥和数字签名的理解
    OpenSSL使用小结
    sql的三种去重
    关于if语句&&运算符先判断空异常
    关于数据库可为null的datetime 字段
    sql server去重
    asp.net updatepanel 局部更新后调用js
    级联 -- 逻辑
    关于滑动验证的思路构思
  • 原文地址:https://www.cnblogs.com/zhuxiaoxiao/p/10402547.html
Copyright © 2011-2022 走看看