// Copyright 2016 fatedier, fatedier@gmail.com // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcp import ( "io" "sync" ) // Join two io.ReadWriteCloser and do some operations. func Join(c1 io.ReadWriteCloser, c2 io.ReadWriteCloser) (inCount int64, outCount int64) { var wait sync.WaitGroup pipe := func(to io.ReadWriteCloser, from io.ReadWriteCloser, count *int64) { defer to.Close() defer from.Close() defer wait.Done() *count, _ = io.Copy(to, from) } wait.Add(2) go pipe(c1, c2, &inCount) go pipe(c2, c1, &outCount) wait.Wait() return }