一、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. 《浅析:java不支持多继承的原因》

    很久以前,博主的一个好朋友给我考了我一个问题,为什么Java不支持多继承,如果多继承会有什么错误.这个问题困扰了我很久,我从单继承方面去推导过,又从多态的层面去思考过,但都无法解释为什么Java不支持 ...

  2. Thread 详解

    转自:http://www.mamicode.com/info-detail-517008.html 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 ...

  3. Python收发邮件

    发送邮件使用SMTP协议,接受POP3或IMAP: 创建邮件内容email模块,发送邮件smtplib模块.发送邮件比较简单,只需先创建SMTP对象,登录服务器后根据发收邮箱地址发送即可: POP3接 ...

  4. [转]MYSQL 创建存储过程

    MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库 ...

  5. js递归算法1+ 2+3.....100的和

    function num(n){    if(n==1) return 1;    return num(n-1)+n;}num(100);

  6. Unity3d对象池

    Singleton.cs 12345678910111213 using UnityEngine;/// <summary>/// 单例模版类/// </summary>pub ...

  7. Intellij IDEA 导入Maven项目

    本人一直使用的eclipse, 但都说IDEA 是java界中最好使用的编辑器 ,所以开始了IDEA的学习,最近使用到了 IDEA 但是,既然编辑器有所差别,所以在使用过程中也难免遇到一些费劲的事情. ...

  8. vue生命周期和钩子函数

    new Vue 创建vue实例 init events & liftcycle 开始初始化 beforeCreate 组件刚被创建,组件属性计算之前,如data属性等 init injecti ...

  9. golang对不同系统的编译

    Golang 支持在一个平台下生成另一个平台可执行程序的交叉编译功能. Mac下编译 # mac编译linux执行文件 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go ...

  10. 在eclipse上集成安装阿里巴巴代码规约P3C插件

    在eclipse上集成安装阿里巴巴代码规约P3C插件 参照网址: https://jingyan.baidu.com/article/2d5afd6923e78b85a3e28e5e.html 首先进 ...