Objective-C (iOS)实现TCP反向代理(Port forward隧道)

之前有一篇文章《华为AnyOffice eSDK建立TCP端口转发隧道》介绍了如何使用Java建立一条TCP端口隧道。实现一个将远程端口反向代理到本地的效果,类似于Nginx。比如你有一个远程Web服务器1.2.3.4:80,你建立起TCP转发隧道后,访问本地的127.0.0.1:8080端口就等于访问远程服务器的80端口。那么反向代理的轮子很多,比如Nginx,Haproxy,NodeJS,Caddy,Apache等等,为什么要自己写一个呢。我当初写这个主要目的还是为了在Android和iPhone手机端使用反向代理功能,并基于此兼容华为AnyOffice提供的eSDK,通过建立隧道来实现4层TCP协议的VPN通讯(注:华为的eSDK只提供了4层的HTTP协议的API,对4层协议没有很好的支持)。


所以这里,就介绍一下如何在IOS上实现一条TCP反向代理隧道。虽然说是用Objc开发的,但主要还是使用C语言实现的,好在IOS和MAC OS都可以在.m文件中混用C/C++和Objc代码,使用C语言的原因是华为的eSDK是用的C语言接口,他们重写了recv()和send(),变成了svn_recv()和svn_send()方法,所以为了实现最好的兼容,我们的隧道也采用C书写。Objc也有很大的任务,那就是使用GCD开启线程,使得整个代码与JAVA代码非常相似,简直如同JAVA代码一句一句翻译过来的一样,所有线程的调度也是一样的,所以在这里我就只贴代码,原理可以去我之前的博客查看。

下面就是在IOS和MAC OS中建立TCP隧道的代码了,下面代码使用的是原生socket,可以跑在任意一台iPhone和MAC主机上,对于MAC,直接在xcode中新建一个命令行应用然后执行main函数即可。对于iOS,需要把main函数放在一条子线程中异步执行。如果要和华为eSDK对接,只需把某些recv()/send()调用换成svn_recv(),svn_send()调用即可。并把下面的remote_socket初始化成svn_socket。并引入华为eSDK的头文件。具体需要更换的地方我都写在注释中了。


源代码中有两处IP地址的赋值,分别是0.0.0.0:8080 和 1.2.3.4:80,其中

0.0.0.0:8080是隧道的入口地址,你使用其他程序(比如浏览器)访问127.0.0.1:8080就等同与访问1.2.3.4:80

1.2.3.4:80是隧道出口地址,也是被反向代理的地址,使用过Nginx的攻城狮们应该不陌生。


#import <
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值