一、Socks5服务器实现设计

本Socks5服务器是之前做的一个项目中的一个小部分东西,该项目是一个可以实现多级转发代理网络通讯的项目,能够隐藏网络数据包的源IP地址和端口,能够为上网的用户提供安全保障,使得那些不怀好意的人无法追踪到数据包的源头,这里面由于涉及到商业方面的东西,所以只能把Socks5服务器抽离出来给说说。所谓Socks5协议,它是一种代理通讯协议,由于其直接转发数据的形式,所以它可以支持很多种协议。在我的实现中使用的是Proxifier作为客户端发起者,将客户端所有的网络协议均转为Socks5代理协议与我的服务器通讯。

在我的Socks5服务器中,大概的设计方案如下:

1. 使用一个线程来监听1080(一般默认的代理端口)端口,该线程接收对1080端口的所有TCP连接,并会验证其身份和合法性,验证结束之后继续监听1080端口。(这里其实可以把该线程的功能更加简短化,只做监听和接收连接的功能,然后将接收到的连接交给后续的工作线程处理。)

2. 当有一个连接到来并且验证成功之后,将会启动一个工作线程,将连接交给工作线程进行后续工作,既Socks5协议中协商目标机的部分了,此时客户端会将想要访问的目标IP和地址按照Socks5协议的格式发送给我,我会为其连接好服务器之后,将我这边使用的IP和端口按照Socks5协议规定的格式返回给客户端,这个时候一旦将返回包send给客户端之后就标志着Socks5协议的交互阶段结束,正式进入通讯阶段,工作线程会等待着第3步里面的通讯线程全部结束之后将资源回收。

3. 此时我会启动四个通讯线程,分别负责客户端<--->Socks5服务器,Socks5服务器<--->目标服务器总共四条通讯线路,这样做的好处是四条线路的线程代码完全一样,都是先收数据,然后发送出去,只是设置的收发的套接字不一样。当遇到接收或者发送失败的时候说明连接已经断开,则跳出线程里的循环,最终挂起的工作线程会继续进行,将通讯线程运行之后使用的资源给完全回收。

4. 最初做的时候没有加入线程池的概念,之后会加入线程池的概念来重新支持服务器中的线程的使用和回收,如果一直开启线程关闭线程,遇到大量连接的时候,效率会变得低下。

后面的内容因为一些原因暂时隐藏一下

socks5服务器编写经验总结的更多相关文章

  1. WEB页面采集器编写经验之一:静态页面采集器

    严格意义来说,采集器和爬虫不是一回事:采集器是对特定结构的数据来源进行解析.结构化,将所需的数据从中提取出来:而爬虫的主要目标更多的是页面里的链接和页面的TITLE. 采集器也写过不少了,随便写一点经 ...

  2. GSM模块_STM32实现GPRS与服务器数据传输经验总结

    硬件环境 MCU:STM32F103RET6 (调试器:J-Link) GSM模块:Ai-Thinker_A6 (安信可)(还需要配一个串口打印工具,当初选这个模块纯粹是因为价格是最便宜的) ---- ...

  3. MVC模式网站编写经验总结

    单个网站使用MVC架构模式经验总结,包含具体网站包分类.包内类的编写.注意事项等方面.本人认为,按照如下包分类及编写方法,已经满足一个简单普通网站(主要针对java)的编写需求. MVC主要层级 数据 ...

  4. CocoSocket开源下载与编写经验分享

    CocoSocket分享 cocos2dx 3.1都出了,但依然没有发现与它原生的SOCKET支持,于是,这几天在家,手工撸了一个. 目前版本对IOS,ANDROID,WINDOWS支持良好.且为异步 ...

  5. 为 Exchange 服务器编写自定义的反垃圾插件

    Exchange 2010 的 Edge Transport 包含了一些 Anti-spam 的 Feature,如图: 都开启了,但是呢,还是会有漏网之鱼,而且把这些邮件自己列为 Junk 也起不了 ...

  6. 动态链接库(DLL)编写经验

    我首先说明DLL的生成方法,之后再补充一些特殊之处. 生成方法: 1.对需要导出的类,在头文件中添加 #ifdef CLASS _API #define CLASS_API _declspec(dll ...

  7. PyCharm 如何远程连接服务器编写程序

    写在前面 我之前一直通过mstsc远程服务器桌面修改代码,或者本地修改后上传到远程服务器等,各种不爽,现在改用xshell,但有时候还是感觉不方便.于是乎,自己动手配置PyCharm远程连接服务器,这 ...

  8. 7-51单片机ESP8266学习-AT指令(8266TCP服务器,编写自己的C#TCP客户端发信息给单片机控制小灯的亮灭)

    http://www.cnblogs.com/yangfengwu/p/8780182.html 自己都是现做现写,如果想知道最终实现的功能,请看最后 先把源码和资料链接放到这里 链接: https: ...

  9. loadrunner脚本编写经验

    最近写了不少loadrunner脚本,记录一下心得:1 loadrunner脚本基本可以认为就是c语言代码(loadrunner支持不同语言的脚本,默认生成的是用c语言写的脚本)2 loadrunne ...

随机推荐

  1. Python学习第四天

    一.数字 int 二.字符串 str #以下均为补充内容 #对于空字符串是假 #数字0是假 #数字和字符串可以相互转换 # a="123" # b=int(a) # a=123 # ...

  2. redis应用--HyperLogLog

    如果你负责开发维护一个大型的网站,有一天老板找产品经理要网站每个网页每天的 UV 数据,然后让你来开发这个统计模块,你会如何实现? 如果统计 PV 那非常好办,给每个网页一个独立的 Redis 计数器 ...

  3. CString与string、char*的区别和转换

    转自:http://blog.csdn.net/luoweifu/article/details/20232379 我们在C++的开发中经常会碰到string.char*以及CString,这三种都表 ...

  4. JS中的变量和数据类型

    所谓变量,就是里面存储的数据是可以改变的. 在使用变量之前,我们需要先声明变量.声明变量的关键字有var  let   const 在ES里面声明变量可以使用var,如下: //var 变量名 var ...

  5. C# XML反序列化与序列化举例:XmlSerializer(转)

    using System; using System.IO; using System.Xml.Serialization; namespace XStream { /// <summary&g ...

  6. [转载]一个高效简洁的Aseprite to Unity导入工具

    原文链接 https://zhuanlan.zhihu.com/p/28644268  期待原作者上传至AssetStore. 今天,我的第一个 Unity 插件 MetaSprite 正式发布了它的 ...

  7. Sql Server 2012 集群配置

    基于Windows Server 2008 R2的WSFC实现SQL Server 2012高可用性组(AlwaysOn Group) 2012年5月 微软新一代数据库产品SQL Server 201 ...

  8. Laravel Scout 开启队列, 自定义queue name和queue connection

    scout.php的默认配置: 'queue' => env('SCOUT_QUEUE', false), 修改为: 'queue' => [ 'queue' => env('SCO ...

  9. amazeUI的confirm控件记录缓存问题的解决办法

    场景:列表行每行都有删除按钮,点击删除按钮将行记录的id传给js方法,js方法中调用amazeui的confirm控件,确认删除function通过ajax执行删除行为. 问题现象:每次删除列表第一行 ...

  10. SQA

    SQA 一.SQA过程 首先组成一个团队,遵循敏捷开发的原则,进行分工合作,为软件开发编造一个用例故事,画出相应的图,小组讨论合作后写代码,软件质量保证(SQA-Software Quality As ...