func main() {
runtime.GOMAXPROCS(1)
listener, err := net.Listen("tcp", "127.0.0.1:8848")
if err != nil {
panic(err)
}
for {
conn, err := listener.Accept()
if err != nil {
panic(err)
}
go handle(conn.(*net.TCPConn))
}
}
func handle(server *net.TCPConn) {
defer server.Close()
client, err := net.Dial("tcp", "127.0.0.1:8849")
if err != nil {
fmt.Print(err)
return
}
defer client.Close()
go func() {
defer server.Close()
defer client.Close()
buf := make([]byte, 2048)
io.CopyBuffer(server, client, buf)
}()
buf := make([]byte, 2048)
io.CopyBuffer(client, server, buf)
}
var pool = make(chan net.Conn, 100)
func borrow() (net.Conn, error) {
select {
case conn := <- pool:
return conn, nil
default:
return net.Dial("tcp", "127.0.0.1:8849")
}
}
func release(conn net.Conn) error {
select {
case pool <- conn:
// returned to pool
return nil
default:
// pool is overflow
return conn.Close()
}
}
func handle(server *net.TCPConn) {
defer server.Close()
client, err := borrow()
if err != nil {
fmt.Print(err)
return
}
defer release(client)
go func() {
defer server.Close()
defer release(client)
buf := make([]byte, 2048)
io.CopyBuffer(server, client, buf)
}()
buf := make([]byte, 2048)
io.CopyBuffer(client, server, buf)
}
var pool = make(chan net.Conn, 100)
type client struct {
conn net.Conn
inUse *sync.WaitGroup
}
func borrow() (clt *client, err error) {
var conn net.Conn
select {
case conn = <- pool:
default:
conn, err = net.Dial("tcp", "127.0.0.1:18849")
}
if err != nil {
return nil, err
}
clt = &client{
conn: conn,
inUse: &sync.WaitGroup{},
}
return
}
func release(clt *client) error {
clt.conn.SetDeadline(time.Now().Add(-time.Second))
clt.inUse.Done()
clt.inUse.Wait()
select {
case pool <- clt.conn:
// returned to pool
return nil
default:
// pool is overflow
return clt.conn.Close()
}
}
func handle(server *net.TCPConn) {
defer server.Close()
clt, err := borrow()
if err != nil {
fmt.Print(err)
return
}
clt.inUse.Add(1)
defer release(clt)
go func() {
clt.inUse.Add(1)
defer server.Close()
defer release(clt)
buf := make([]byte, 2048)
io.CopyBuffer(server, clt.conn, buf)
}()
buf := make([]byte, 2048)
io.CopyBuffer(clt.conn, server, buf)
}
var pool = make(chan net.Conn, 100)
type client struct {
conn net.Conn
inUse *sync.WaitGroup
isValid int32
}
const maybeValid = 0
const isValid = 1
const isInvalid = 2
func (clt *client) Read(b []byte) (n int, err error) {
n, err = clt.conn.Read(b)
if err != nil {
if !isTimeoutError(err) {
atomic.StoreInt32(&clt.isValid, isInvalid)
}
} else {
atomic.StoreInt32(&clt.isValid, isValid)
}
return
}
func (clt *client) Write(b []byte) (n int, err error) {
n, err = clt.conn.Write(b)
if err != nil {
if !isTimeoutError(err) {
atomic.StoreInt32(&clt.isValid, isInvalid)
}
} else {
atomic.StoreInt32(&clt.isValid, isValid)
}
return
}
type timeoutErr interface {
Timeout() bool
}
func isTimeoutError(err error) bool {
timeoutErr, _ := err.(timeoutErr)
if timeoutErr == nil {
return false
}
return timeoutErr.Timeout()
}
func borrow() (clt *client, err error) {
var conn net.Conn
select {
case conn = <- pool:
default:
conn, err = net.Dial("tcp", "127.0.0.1:18849")
}
if err != nil {
return nil, err
}
clt = &client{
conn: conn,
inUse: &sync.WaitGroup{},
isValid: maybeValid,
}
return
}
func release(clt *client) error {
clt.conn.SetDeadline(time.Now().Add(-time.Second))
clt.inUse.Done()
clt.inUse.Wait()
if clt.isValid == isValid {
return clt.conn.Close()
}
select {
case pool <- clt.conn:
// returned to pool
return nil
default:
// pool is overflow
return clt.conn.Close()
}
}
func handle(server *net.TCPConn) {
defer server.Close()
clt, err := borrow()
if err != nil {
fmt.Print(err)
return
}
clt.inUse.Add(1)
defer release(clt)
go func() {
clt.inUse.Add(1)
defer server.Close()
defer release(clt)
buf := make([]byte, 2048)
io.CopyBuffer(server, clt, buf)
}()
buf := make([]byte, 2048)
io.CopyBuffer(clt, server, buf)
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有