这段时间接触了网络代理,而自己的任务是完成TCP和UDP的网络代理,所以在这里写些自己的理解吧。

  这篇文章先介绍一下TCP代理的鉴权过程(采用的是用户名和密码鉴权),下一篇文章再介绍UDP代理的鉴权过程吧。

  自己写了一个sdk的demo,主要使用的是CocoaAsyncSocket里的GCDAsyncSocket和GCDAsyncUdpSocket。其他使用的文件参见下图

    

  创建SJXTCPSocketClient,继承自NSURLProtocol。在 .h 文件中添加关键的成员变量和方法,如下图

    

  在 .m 文件中添加一个记录通信管道的对象,用于保存tcp本地通信和远端通信的管道,并进行相应的通信操作。

    

  第一步:设置TCP代理地址和端口,并开启监听。    

    

  第二步:当UrlProtocol拦截到TCP请求时,会调用 didAcceptNewSocket ,则设置tcp本地通信管道的连接。   

    

  第三步:- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 会响应,判断上一步操作的 tag标记,建立tcp本地通信管道的连接。

    

  第四步:- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag 会响应,判断上一步操作的 tag标记,完成tcp本地通信管道的连接。

    

  第五步:- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 会响应,根据 tag标记,设置与远端连接的协商方式。

    

  这里使用的是用户名和密码的协商方式,设置tcp远端通信管道的连接。

    

  第六步:didConnectToHost 会响应,开始与代理服务器的进行第一步鉴权操作

    

  根据自己的需求,完成自己需要的数据,这里以  050102  为例

    

  第七步:这里会响应 didWriteDataWithTag,再设置读取的data,让 didReadData响应,对代理服务器返回data进行第一步鉴权结果的判断。如果第一步鉴权成功,则根据自己的要求设置对应的用户名和密码,将用户名和密码根据要求拼接成正确的data发给代理服务器,进行与代理服务器的第二步鉴权操作。

    

    

  第八步:同样的这里会响应 didWriteDataWithTag,再设置读取的data,让 didReadData响应,这里对代理服务器返回data进行第二步鉴权结果的判断。如果第二步鉴权通过,则代理服务器尝试与目标服务器进行连接。

    

  第九步:通过 didWriteDataWithTag 和 didReadData 的响应,如果代理服务器与目标服务器进行连接成功,则可以进行 tcp代理转发数据。

    

  自己写了一个demo,以供参考。希望各位大神多多指正。

  GitHub:https://github.com/sjxjjx/SJXSocket

iOS进阶之TCP代理鉴权过程的更多相关文章

  1. iOS进阶之UDP代理鉴权过程

    上一篇介绍的是TCP代理的鉴权过程,这篇将介绍UDP代理的大致鉴权过程. 在UDP鉴权过程中,有几点是需要注意的.首先,UDP是一种无连接协议,不需要连接,使用广播的方式:其次,为了通过鉴权,所以需要 ...

  2. PMS权限管理和鉴权过程

    一.权限的管理基础知识 1.系统的权限机制分为:权限解析.权限分配.鉴权.动态添加权限 2.PermissionInfo :  PackageParser.Permission中包含一个对应的Perm ...

  3. EasyNVR如何实现跨域鉴权

    EasyNVR提供简单的登录鉴权,客户端通过用户名密码登录成功后,服务端返回认证token的cookie, 后续的接口访问, 服务端从cookie读取token进行校验. 但是, 在与客户系统集成时, ...

  4. Tomcat 容器的安全认证和鉴权

    大量的 Web 应用都有安全相关的需求,正因如此,Servlet 规范建议容器要有满足这些需求的机制和基础设施,所以容器要对以下安全特性予以支持: 身份验证:验证授权用户的用户名和密码 资源访问控制: ...

  5. 【Spring Cloud & Alibaba 实战 | 总结篇】Spring Cloud Gateway + Spring Security OAuth2 + JWT 实现微服务统一认证授权和鉴权

    一. 前言 hi,大家好~ 好久没更文了,期间主要致力于项目的功能升级和问题修复中,经过一年时间的打磨,[有来]终于迎来v2.0版本,相较于v1.x版本主要完善了OAuth2认证授权.鉴权的逻辑,结合 ...

  6. Mongodb 认证鉴权那点事

    [TOC] 一.Mongodb 的权限管理 认识权限管理,说明主要概念及关系 与大多数数据库一样,Mongodb同样提供了一套权限管理机制. 为了体验Mongodb 的权限管理,我们找一台已经安装好的 ...

  7. springboot+security整合(3)自定义鉴权

    说明 springboot 版本 2.0.3源码地址:点击跳转 系列 springboot+security 整合(1) springboot+security 整合(2) springboot+se ...

  8. gitlab配置smtp时,总是提示需要鉴权,记录一下爬坑过程。

    配置好smtp,然后发送邮件时总是提示 Net::SMTPFatalError: 550 5.7.1 authentication is required 最后发现是因为在gitlab web界面上配 ...

  9. apigw鉴权分析(1-4)新浪微博开放平台 - 鉴权分析

    一.访问入口 http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E 微博开放接口的调用,如 ...

随机推荐

  1. 解决Tomcatt下连接数据库的classNoFount问题

    在数据库连接单独使用的时候.即作为一个独立类建立在mian方法中,可以正确的使用.例:连接MySql数据库 import java.sql.*; public class SQLtest { // J ...

  2. ASP.NET Core 问题排查:Request.EnableRewind 后第一次读取不到 Request.Body

    实际应用场景是将用户上传的文件依次保存到阿里云 OSS 与腾讯云 COS ,实现方式是在启用 Request.EnableRewind() 的情况下通过 Request.Body 读取流,并依次通过 ...

  3. lua 操作redis

    Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行.使用脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在red ...

  4. c#重命名文件,报错“System.NotSupportedException”类型的未经处理的异常在 mscorlib.dll 中发生”

    修改远程服务器的文件名,报错“System.NotSupportedException”类型的未经处理的异常在 mscorlib.dll 中发生”,“System.NotSupportedExcept ...

  5. WPF气泡样式弹窗效果

    页面设计需求,做了一个气泡形状的弹出框,效果如下: 设计思路如下: 1. 使用Path绘制气泡的尖尖,将这个放到顶层: 2. 在用border绘制长方形框,将这个放到底层,并且设置Margin值,使得 ...

  6. /etc/inittab文件详解

    /etc/inittab由/sbin/init程序解析调用,用于系统初始化,/sbin/init可参考源码busybox中init.c的实现方式. 原址如下: http://leejia.blog.5 ...

  7. python中字符串的拼接

    1.+ 号 2.format() 3.f"{username}登录成功" 4.%s 5.列表中的 join 6.逗号 http://www.cnblogs.com/gengcx/p ...

  8. 批量将PowerDesigner中表字段由小写变成大写

    通过以下VB脚本即可批量修改,在Tools=>Execute Commands下的Edit/Run Scripts,或者通过Ctrl+Shift+X运行以下脚本即可: '************ ...

  9. readlink 获取进程的绝对路径

    readlink可以获取exe所在的路径(直接和进程关联);无法获得so的路径,so路径可以用dladdr,参考另一篇文章linux系统中有个符号链接:/proc/self/exe 它代表当前程序,所 ...

  10. JAVA项目中文件重命名方式

    可以直接改类名,之后eclipse会报错: 点击×号会给出解决方案: 注意:不能通过右击servlet文件直接重命名.否则运行之后程序会报错(文件路径不对之类的)