• 自建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

    运行效果图

  • 相关阅读:
    ibatis集成封装之路(to mysql)
    设计模式第一弹—适配器模式
    markdown语法
    outlook vba开发要点
    PHP中json_encode中文编码的问题_学习
    isset、empty、var==null、is_null、var===null详细理解
    对冒泡和二分法,特别是二分法有了更深的理解
    php Socket表单提交学习一下
    php Socket模拟表单上传文件函数_学习
    java第九节 网络编程的基础知识
  • 原文地址:https://www.cnblogs.com/zhuxiaoxiao/p/10402547.html
Copyright © 2020-2023  润新知