一、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. 逐帧动画 两种实现方式 css和js

    第一种: css部分: <style> #foxtail{ background: url(../img/foxtail.png) 0 0 no-repeat; width: 156px; ...

  2. Static,重载,List的知识点

    声明为static的成员可以在它的类的对象创建之前被访问,静态方法不能访问实例变量. 声明为static的变量称为静态变量或类变量,static可以用来修饰属性.方法和代码块. 多重继承的初始化顺序是 ...

  3. C# 索引和长度必须引用该字符串内的位置 LENGTH

    今天遇到了 索引和长度必须引用该字符串内的位置 的问题. 原因是实用 Substring 对字符串进行了前五位的截取,但是忽略了字符串本身不足五位的情况. 如果不足五位,直接将整个字符串赋值过来,添加 ...

  4. dom编程艺术笔记1--第二章

    第二章语法部分: 1.js注释:<!-- XXXXX 而“-->”这部分js会认为是注释内容的一部分 2.var 声明变量 不用声明变量类型 3.声明使用一个数组语法:var object ...

  5. ecplise中设置字符编码

    ecplise 设置 1 ecplise编码格式 右键 在general-workspace- text file encoding 选择utf-8 2 jsp文件编码格式 web-jspfile-e ...

  6. Problem B: 一切皆对象

    Description 一切都是对象 —— Everything is an object. 所以,现在定义一个类Thing,来描述世界上所有有名字的事物.该类只有构造函数.拷贝构造函数和析构函数,并 ...

  7. 如何在linux环境安装数据库

    1.1      获取oracle 数据库安装包: 注意:获取的是database的安装包,不是客户端的安装包 1.2      以root用户登陆云主机,修改主机名 Hostname 1.2.1   ...

  8. Oracle学习DayFive(PL/SQL)

    一.PL/SQL简介  PL/SQL 是 Procedure Language & Structured Query Language 的缩写.PL/SQL 是对 SQL 语言存储过程语言的扩 ...

  9. 各种sqlite管理工具

    sqlite管理工具 平台 下载链接 sqlitestudio 支持多平台 https://sqlitestudio.pl/index.rvt?act=download sqlitespy windo ...

  10. 第二次靶场练习:cookie注入

    cookie注入 本文章目的是对相关的黑客内容进一步了解,如有人违反相关的法律法规,本人概不负责 一.学习目的: 利用手工注入网站 利用sqlmab注入 二.附件说明 靶场网址:http://120. ...