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
}
}
}

问题总结

没有进行大量测试,未对详细错误进行错误处理,程序容易崩溃

Golang TCP转发到指定地址的更多相关文章

  1. Golang tcp转发 remoteAddr错误

    Golang tcp 转发 第一版本 accept获取的Conn里的localAddr做为源地址,remoteAddr来做为目的地址 // tcpForward package main import ...

  2. TODO:Golang语言TCP/UDP协议重用地址端口

    TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...

  3. centos7 编译安装nginx+tcp转发

    一.依赖 1. gcc 安装安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装: yum install gcc-c++ 2. PCRE pc ...

  4. [转帖]【rinetd】CentOS7.x上轻量级TCP转发工具rinetd的安装配置

    [rinetd]CentOS7.x上轻量级TCP转发工具rinetd的安装配置 https://www.jianshu.com/p/2605d247b944 这一个写的更加全面了. 2019.07.0 ...

  5. 在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统? 网络层协议 MAC帧、IP数据报、TCP报文 关系 IP地址与硬件地址 链路层与网络层

    小结: 1. 网络层两种服务 虚电路服务 virtual circuit  电信网 网络层负责可靠交付 数据报服务  网络层不负责可靠交付 提供灵活的.无连接的.尽最大努力交付的数据报服务 不提供服务 ...

  6. 手头没证书,如何给https做代理?Nginx TCP转发

    线上的一个海外充值接口(https)经常因我朝网络问题中断,想借助hk的机器做个https反向代理又没证书. 一开始 一开始想到的办法是借助Nginx的tcp转发进行代理: 编译NGINX时加入 -- ...

  7. winfrom绘制渐变 / 调用浏览器访问指定地址

    private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) {//绘制渐变色背景 Graphics g ...

  8. nginx 1.15.10 前端代理转发 将多个地址,代理转发到一个地址和端口 多系统公用一个cookie 统一token

    nginx 1.15.10 前端代理转发 将多个地址,代理转发到一个地址和端口 多系统公用一个cookie 统一token 注意: proxy_pass http://192.168.40.54:22 ...

  9. keil 编译器V6 定义函数在ram中运行-和在指定地址定义常量

    之前一直是用v5编译,编译速度慢,换成V6编译速度差不多快50% ,而且arm后期只维护v5编译器不在更新v5编译器.切换到V6编译器大势所趋,把之前v5且换到v6需要如下更改: 1. CMSIS包需 ...

随机推荐

  1. PHP命名大小写敏感规则

    一直觉得PHP中各种大小写规则理不清,就连工作多年的老手们也不一定能对PHP大小写敏感问题足够了解.在PHP中,大小写敏感问题的处理比较乱,大家一定要注意.即使某些地方大小写不敏感,但在编程过程中能始 ...

  2. VxWorks实验八 信号

    实验八信号1 实验目的1.学习使用信号2 实验内容在实验一建立的 project 中,编写一段信号处理程序,将其与SIGINT 相关连,使用kill()发送SIGINT 信号并调用信号处理程序.观察运 ...

  3. js 对象深拷贝

    /* *p需要拷贝的对象 * */ var deepCopy=function(p, c) { var c = c || {}; for (var i in p) { if (typeof p[i] ...

  4. python进阶05 常用问题库(1)json os os.path模块

    python进阶05 常用问题库(1)json os os.path模块 一.json模块(数据交互) web开发和爬虫开发都离不开数据交互,web开发是做网站后台的,要跟网站前端进行数据交互 1.什 ...

  5. response.setContentType() 作用及参数用法

    笔者感冒了,转载大神的 https://blog.csdn.net/luman1991/article/details/53423305 下载中设置文件名称 https://blog.csdn.net ...

  6. CSS——三种页面引入方法

    目的:为了把样式和内容分开,并且使网页元素更加丰富,引入了CSS CSS页面引入有三种方式: 1)内联式:比较不常用,因为内容和样式仍然在一起,不方便.示例: <!DOCTYPE html> ...

  7. STM32之CAN

    概述:STM32有3个发送邮箱,发送调度器根据优先级决定先发送那个,相当于有3个发送帧FIFO;接收方面有14个过滤器,通过编程可以从CAN的接收引脚中选择需要的报文然后分别给2个接收帧FIFO(每个 ...

  8. 六,IO系统

    六,IO系统 一,数据源 1,数据源--管道确认使用那根管道--节点流 2,先确定管道在tey中new出管道,new出后就写关闭代码,写完关闭代码在写中间代码 3,取数据和放数据结束语句必须有两个,不 ...

  9. WPF (VisualChildren)可视化子元素详解

    VisualChildrenCount    的 FrameworkElement 实现始终返回 0 或 1.  如果类所要维护的可视化子元素集合的成员数可能超过 1,则这样的类必须重写此属性和 Ge ...

  10. hashlib(加盐)回炉练习

    简介: 用于加密相关的操作,代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法.在python3中已经废弃了md5和sha模块,简单说明 ...