golang tcp 2 unix socket proxy

想将mysql 的TCP 封死,所有外部链接由我的proxy来控制,so 写了一个 tcp 转 unix socket 的 proxy。

package main

import (
	"os"
	"fmt"
	"net"
	"io"
	"sync"
	"time"
)

type proxy struct{
	Host string
	Port string
	Local string
}

func runProxy(list []proxy) {
	wg := sync.WaitGroup{}
	for _, v := range list {
		wg.Add(1)
		go func() {
			eachServer(v.Host, v.Port, v.Local)
			wg.Done()
		}()
	}
	wg.Wait()
}

func eachServer(host string, port string, local string) {
	l,err := net.Listen("tcp", fmt.Sprintf("%s:%s", host, port))
	if err != nil {
		fmt.Print("listen tcp :%s",err.Error())
		os.Exit(1)
	}
	defer l.Close()

	for {
		tc,err := l.Accept()
		if err != nil {
			fmt.Printf("accept tcp conn :%s",err.Error())
			tc.Close()
			continue
		}

		go eachConn(local, tc)
	}
}

func eachConn(local string, tc net.Conn) {
	uc,err := net.Dial("unix", local)
	if err != nil {
		fmt.Printf("get unix conn :%s",err.Error())
		uc.Close()
		return
	}
	go io.Copy(tc, uc)
	go io.Copy(uc, tc)
}

func main() {
	list := []proxy{proxy{Host:"192.168.8.101",Port:"3306",Local:"/home/work/data/tmp/mysql3306.sock"}}
	runProxy(list)
}
时间: 2024-10-21 17:27:57

golang tcp 2 unix socket proxy的相关文章

Nginx 中 fastcgi_pass 监听端口 unix socket和tcp socket差

Nginx 中 fastcgi_pass 监听端口 unix socket和tcp socket差别 Nginx连接fastcgi的方式有2种:unix domain socket和TCP,Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信.与管道相比,Unix domain sockets 既可以使用字节流和数据队列,而管道通信则只能通过字节流.Unix domain sockets的接口和Internet socke

nginx 和 php-fpm 通信使用unix socket还是TCP,及其配置

前言 nginx和fastcgi的通信方式有两种,一种是TCP的方式,一种是unix socke方式.两种方式各有优缺点,这里先给出两种的配置方法,然后再对性能.安全性等做出总结. TCP是使用TCP端口连接127.0.0.1:9000 Socket是使用unix domain socket连接套接字/dev/shm/php-cgi.sock(很多教程使用路径/tmp,而路径/dev/shm是个tmpfs,速度比磁盘快得多),在服务器压力不大的情况下,tcp和socket差别不大,但在压力比较满

golang tcp socket

golang tcp socket编程和http差不多的感觉,也是请求应答的方式,TCP请求需要(ip地址,协议,端口)这三项,跟http请求差不多,我们现在来模拟一个请求和应答来,请求的一方我们就叫做client.go package main import ( "fmt" "io/ioutil" "net" "os" ) func main() { tcpAddr, err := net.ResolveTCPAddr(&q

【转】nginx 和 php-fpm 通信使用unix socket还是TCP,及其配置

原文: http://blog.csdn.net/pcyph/article/details/46513521 -------------------------------------------------------------------------------------------------------------------- 前言 nginx和fastcgi的通信方式有两种,一种是TCP的方式,一种是unix socke方式.两种方式各有优缺点,这里先给出两种的配置方法,然后再

Golang网络库中socket阻塞调度源码剖析

本文分析了Golang的socket文件描述符和goroutine阻塞调度的原理.代码中大部分是Go代码,小部分是汇编代码.完整理解本文需要Go语言知识,并且用Golang写过网络程序.更重要的是,需要提前理解goroutine的调度原理. 1. TCP的连接对象: 连接对象: 在net.go中有一个名为Conn的接口,提供了对于连接的读写和其他操作: type Conn interface { Read(b []byte) (n int, err error) Write(b []byte)

TCP协议和socket API 学习笔记

本文转载至 http://blog.chinaunix.net/uid-16979052-id-3350958.html 分类: 原文地址:TCP协议和socket API 学习笔记 作者:gilbertjuly  • TCP包头 ACK为1时,确认序号有效,表示期望收到的下一个序号,是上次成功收到的字节序加1. SYN, FIN都占用一个序号. • TCP连接的建立 client通过connect()来建立TCP连接,connect()会发送SYN报文: server通过bind().list

python之socket实现unix socket及dash字符串操作

python的socket库可以实现tcp和udp,在linux下unix socket也是可以的,有些程序在进程间通信就是使用unix socket,如果我们想查看其通信的信息来进行调试,则可以用python来伪造其接口,获取内容 参考:https://docs.python.org/2/library/socket.html import socket import os  if __name__ == '__main__':          sock = socket.socket(so

转:用unix socket加速php-fpm、mysql、redis的连接

图虫的服务器长期是单机运行.估计除了mysql之外,php-fpm和redis还可以在单机上共存很长时间.(多说服务器早就达成了单机每日2000万+动态请求,所以我对单机搞定图虫的大流量非常乐观) 如果是单机服务,其实就不需要用IP哪怕是127.0.0.1这样的IP去连接mysql/redis/php了,因为即使是127.0.0.1也是要走TCP/IP层的. unix提供的unix socket来实现单机的端口访问,很多文章提到用unix socket可以提升连接速度. 我简单测试了一下,200

[daily][netcat] 在UNIX socket上使用netcat

概述 默认情况下,系统里边带的netcat,也就是nc.支持tcp,udp,ipv4,ipv6但是不支持unix socket. 而且,telnet也不支持. 除非自己写一个,不然很不方便. 另一个netcat 前边讲的netcat是gnu-netcat包里的工具. 其实,还有另一个:openbsd-netcat ─>$ sudo pacman -Ss netcat extra/gnu-netcat 0.7.1-7 GNU rewrite of netcat, the network pipin