Golang TCP转发到指定地址
Golang TCP转发到指定地址
第二个版本,设置指定ip地址
代码
// tcpForward
package main
import (
"fmt"
"net"
"os"
)
func TcpForward(port int, forAddr string) {
lisPort := fmt.Sprint(":", port)
listen, err := net.Listen("tcp", lisPort)
if err != nil {
fmt.Printf("fault to listen,err: %s", err.Error())
os.Exit(1)
}
defer listen.Close()
fmt.Printf("listenning now!")
for {
fromConn, err := listen.Accept()
if err != nil {
fmt.Printf("fault,err: %s", err.Error())
fromConn.Close()
continue
}
//fmt.Printf(fromConn.LocalAddr(), " ", fromConn.RemoteAddr(), " ", fromConn)
//buf := make([]byte, 2048)
//fromConn.Read(buf)
//fmt.Printf(string(buf))
if forAddr == "" {
go toDial(fromConn)
} else {
go forDial(fromConn, forAddr)
}
}
}
func forDial(fromConn net.Conn, forAddr string) {
toConn, err := net.Dial("tcp", forAddr)
if err != nil {
fmt.Printf("fault,err: %s", err.Error())
toConn.Close()
return
}
fmt.Printf("%s to %s", fromConn.LocalAddr().String(), toConn.RemoteAddr().String())
go copy(fromConn, toConn, 512)
go copy(toConn, fromConn, 512)
}
func toDial(fromConn net.Conn) {
toAddr := fromConn.RemoteAddr()
toConn, err := net.Dial("tcp", toAddr.String())
if err != nil {
fmt.Printf("fault,err: %s", err.Error())
toConn.Close()
return
}
fmt.Printf("%s to %s", fromConn.LocalAddr().String(), toConn.RemoteAddr().String())
go copy(fromConn, toConn, 512)
go copy(toConn, fromConn, 512)
}
func copy(f, t net.Conn, n int) {
defer f.Close()
defer t.Close()
var buf = make([]byte, n)
for {
count, err := f.Read(buf)
if err != nil {
fmt.Printf("fault,err: %s", err.Error())
break
}
count, err = t.Write(buf[:count])
if err != nil {
fmt.Printf("fault,err: %s", err.Error())
break
}
}
}
问题总结
// tcpForward
package main
import (
"fmt"
"net"
"os"
)
func TcpForward(port int, forAddr string) {
lisPort := fmt.Sprint(":", port)
listen, err := net.Listen("tcp", lisPort)
if err != nil {
fmt.Printf("fault to listen,err: %s", err.Error())
os.Exit(1)
}
defer listen.Close()
fmt.Printf("listenning now!")
for {
fromConn, err := listen.Accept()
if err != nil {
fmt.Printf("fault,err: %s", err.Error())
fromConn.Close()
continue
}
//fmt.Printf(fromConn.LocalAddr(), " ", fromConn.RemoteAddr(), " ", fromConn)
//buf := make([]byte, 2048)
//fromConn.Read(buf)
//fmt.Printf(string(buf))
if forAddr == "" {
go toDial(fromConn)
} else {
go forDial(fromConn, forAddr)
}
}
}
func forDial(fromConn net.Conn, forAddr string) {
toConn, err := net.Dial("tcp", forAddr)
if err != nil {
fmt.Printf("fault,err: %s", err.Error())
toConn.Close()
return
}
fmt.Printf("%s to %s", fromConn.LocalAddr().String(), toConn.RemoteAddr().String())
go copy(fromConn, toConn, 512)
go copy(toConn, fromConn, 512)
}
func toDial(fromConn net.Conn) {
toAddr := fromConn.RemoteAddr()
toConn, err := net.Dial("tcp", toAddr.String())
if err != nil {
fmt.Printf("fault,err: %s", err.Error())
toConn.Close()
return
}
fmt.Printf("%s to %s", fromConn.LocalAddr().String(), toConn.RemoteAddr().String())
go copy(fromConn, toConn, 512)
go copy(toConn, fromConn, 512)
}
func copy(f, t net.Conn, n int) {
defer f.Close()
defer t.Close()
var buf = make([]byte, n)
for {
count, err := f.Read(buf)
if err != nil {
fmt.Printf("fault,err: %s", err.Error())
break
}
count, err = t.Write(buf[:count])
if err != nil {
fmt.Printf("fault,err: %s", err.Error())
break
}
}
}
没有进行大量测试,未对详细错误进行错误处理,程序容易崩溃
Golang TCP转发到指定地址的更多相关文章
- Golang tcp转发 remoteAddr错误
Golang tcp 转发 第一版本 accept获取的Conn里的localAddr做为源地址,remoteAddr来做为目的地址 // tcpForward package main import ...
- TODO:Golang语言TCP/UDP协议重用地址端口
TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...
- centos7 编译安装nginx+tcp转发
一.依赖 1. gcc 安装安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装: yum install gcc-c++ 2. PCRE pc ...
- [转帖]【rinetd】CentOS7.x上轻量级TCP转发工具rinetd的安装配置
[rinetd]CentOS7.x上轻量级TCP转发工具rinetd的安装配置 https://www.jianshu.com/p/2605d247b944 这一个写的更加全面了. 2019.07.0 ...
- 在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统? 网络层协议 MAC帧、IP数据报、TCP报文 关系 IP地址与硬件地址 链路层与网络层
小结: 1. 网络层两种服务 虚电路服务 virtual circuit 电信网 网络层负责可靠交付 数据报服务 网络层不负责可靠交付 提供灵活的.无连接的.尽最大努力交付的数据报服务 不提供服务 ...
- 手头没证书,如何给https做代理?Nginx TCP转发
线上的一个海外充值接口(https)经常因我朝网络问题中断,想借助hk的机器做个https反向代理又没证书. 一开始 一开始想到的办法是借助Nginx的tcp转发进行代理: 编译NGINX时加入 -- ...
- winfrom绘制渐变 / 调用浏览器访问指定地址
private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) {//绘制渐变色背景 Graphics g ...
- nginx 1.15.10 前端代理转发 将多个地址,代理转发到一个地址和端口 多系统公用一个cookie 统一token
nginx 1.15.10 前端代理转发 将多个地址,代理转发到一个地址和端口 多系统公用一个cookie 统一token 注意: proxy_pass http://192.168.40.54:22 ...
- keil 编译器V6 定义函数在ram中运行-和在指定地址定义常量
之前一直是用v5编译,编译速度慢,换成V6编译速度差不多快50% ,而且arm后期只维护v5编译器不在更新v5编译器.切换到V6编译器大势所趋,把之前v5且换到v6需要如下更改: 1. CMSIS包需 ...
随机推荐
- 线程池(2)Executors.newFixedThreadPool
例子: ExecutorService es = Executors.newFixedThreadPool(5); try { for (int i = 0; i < 20; i++) { Ru ...
- openstack安装newton版本创建虚拟机(五)
一.创建网络: 1.在控制节点上创建一个单一扁平网络(名字:flat),网络类型为flat,网络适共享的(share),网络提供者:physnet1,它是和eth0关联起来的 [root@linux- ...
- this、apply、call的指向
1.关于this this它总是返回一个对象,是指调用当前函数的对象,由于对象的属性可以赋给另一个对象,所以属性所在的当前对象是可变的,即this的指向是可变的. var person={ name: ...
- Swagger 2.0 集成配置
传统的API文档编写存在以下几个痛点: 对API文档进行更新的时候,需要通知前端开发人员,导致文档更新交流不及时: API接口返回信息不明确 大公司中肯定会有专门文档服务器对接口文档进行更新. 缺乏在 ...
- 前端html与css学习笔记总结篇(超详细)
第一部分 HTML 第一章 职业规划和前景 职业方向规划定位: web前端开发工程师 web网站架构师 自己创业 转岗管理或其他 web前端开发的前景展望: 未来IT行业企业需求最多的人才 结合最新的 ...
- C#高级语法
委托 委托就是指针函数,委托的定义与类的属性定义类似都必须在类的方法体进行. 委托的定义: class Program { //定义委托:委托不能在方法体内定义. public delegate st ...
- MyBatis学习总结(一)
MyBatis,是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解 ...
- Java虚拟机内存分配与回收策略
内存分配与回收策略 Minor GC 和 Full GC Minor GC:发生在新生代上,因为新生代对象存活时间很短,因此 Minor GC 会频繁执行, 执行的速度一般也会比较快. Full GC ...
- <img/>标签属性
属性 属性值 描述 src url 图像的路径 alt 文本 ...
- PHP变量、数据类型、字符串、运算符、条件语句、循环语句、数组、函数
PHP 简介: php :是一门动态交互的计算机语言 静态交互 html css js 但凡是动态交互的 都需要服务器. php都是以.php结尾的文件 Html文件里不能写php代码,但是ph ...