1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-12-30 05:56:54 -05:00

Simplify channel operations

This commit is contained in:
V2Ray 2015-09-13 20:01:50 +02:00
parent ef950770fe
commit d12737b3b8
11 changed files with 63 additions and 176 deletions

View File

@ -16,7 +16,7 @@ type ConnectionConfig struct {
// Config is the config for Point server.
type Config struct {
Port uint16 `json:"port"` // Port of this Point server.
Port uint16 `json:"port"` // Port of this Point server.
InboundConfig ConnectionConfig `json:"inbound"`
OutboundConfig ConnectionConfig `json:"outbound"`
}

View File

@ -1,75 +0,0 @@
package io
import (
"errors"
)
const (
SizeSmall = 16
SizeMedium = 128
SizeLarge = 512
)
var (
ErrorNoChannel = errors.New("No suitable channels found.")
)
type BufferSet struct {
small chan []byte
medium chan []byte
large chan []byte
}
func NewBufferSet() *BufferSet {
bSet := new(BufferSet)
bSet.small = make(chan []byte, 128)
bSet.medium = make(chan []byte, 128)
bSet.large = make(chan []byte, 128)
return bSet
}
func (bSet *BufferSet) detectBucket(size int, strict bool) (chan []byte, error) {
if strict {
if size == SizeSmall {
return bSet.small, nil
} else if size == SizeMedium {
return bSet.medium, nil
} else if size == SizeLarge {
return bSet.large, nil
}
} else {
if size <= SizeSmall {
return bSet.small, nil
} else if size <= SizeMedium {
return bSet.medium, nil
} else if size <= SizeLarge {
return bSet.large, nil
}
}
return nil, ErrorNoChannel
}
func (bSet *BufferSet) FetchBuffer(minSize int) []byte {
var buffer []byte
byteChan, err := bSet.detectBucket(minSize, false)
if err != nil {
return make([]byte, minSize)
}
select {
case buffer = <-byteChan:
default:
buffer = make([]byte, minSize)
}
return buffer
}
func (bSet *BufferSet) ReturnBuffer(buffer []byte) {
byteChan, err := bSet.detectBucket(len(buffer), true)
if err != nil {
return
}
select {
case byteChan <- buffer:
default:
}
}

View File

@ -9,7 +9,6 @@ import (
"errors"
"fmt"
"io"
_ "log"
mrand "math/rand"
"github.com/v2ray/v2ray-core"
@ -27,6 +26,8 @@ const (
var (
ErrorInvalidUser = errors.New("Invalid User")
emptyIV = make([]byte, blockSize)
)
// VMessRequest implements the request message of VMess protocol. It only contains
@ -75,7 +76,7 @@ func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
}
request.UserId = *userId
decryptor, err := NewDecryptionReader(reader, userId.Hash([]byte("PWD")), make([]byte, blockSize))
decryptor, err := NewDecryptionReader(reader, userId.Hash([]byte("PWD")), emptyIV)
if err != nil {
return nil, err
}
@ -224,7 +225,7 @@ func (w *VMessRequestWriter) Write(writer io.Writer, request *VMessRequest) erro
if err != nil {
return err
}
aesStream := cipher.NewCFBEncrypter(aesCipher, make([]byte, blockSize))
aesStream := cipher.NewCFBEncrypter(aesCipher, emptyIV)
cWriter := v2io.NewCryptionWriter(aesStream, writer)
_, err = writer.Write(buffer[0:encryptionBegin])

View File

@ -1,4 +1,4 @@
package core
package net
import (
"net"

View File

@ -1,7 +1,6 @@
package freedom
import (
"io"
"net"
"github.com/v2ray/v2ray-core"
@ -36,31 +35,14 @@ func (vconn *FreedomConnection) Start(ray core.OutboundRay) error {
}
func (vconn *FreedomConnection) DumpInput(conn net.Conn, input <-chan []byte, finish chan<- bool) {
for {
data, open := <-input
if !open {
finish <- true
log.Debug("Freedom finishing input.")
break
}
nBytes, err := conn.Write(data)
log.Debug("Freedom wrote %d bytes with error %v", nBytes, err)
}
v2net.ChanToWriter(conn, input)
finish <- true
}
func (vconn *FreedomConnection) DumpOutput(conn net.Conn, output chan<- []byte, finish chan<- bool) {
for {
buffer := make([]byte, 512)
nBytes, err := conn.Read(buffer)
log.Debug("Freedom reading %d bytes with error %v", nBytes, err)
if err == io.EOF {
close(output)
finish <- true
log.Debug("Freedom finishing output.")
break
}
output <- buffer[:nBytes]
}
v2net.ReaderToChan(output, conn)
close(output)
finish <- true
}
func (vconn *FreedomConnection) CloseConn(conn net.Conn, finish <-chan bool) {

View File

@ -2,13 +2,13 @@ package socks
import (
"errors"
"io"
"net"
"strconv"
"github.com/v2ray/v2ray-core"
socksio "github.com/v2ray/v2ray-core/io/socks"
"github.com/v2ray/v2ray-core/log"
v2net "github.com/v2ray/v2ray-core/net"
)
var (
@ -127,31 +127,14 @@ func (server *SocksServer) HandleConnection(connection net.Conn) error {
}
func (server *SocksServer) dumpInput(conn net.Conn, input chan<- []byte, finish chan<- bool) {
for {
buffer := make([]byte, 512)
nBytes, err := conn.Read(buffer)
log.Debug("Reading %d bytes, with error %v", nBytes, err)
if err == io.EOF {
close(input)
finish <- true
log.Debug("Socks finishing input.")
break
}
input <- buffer[:nBytes]
}
v2net.ReaderToChan(input, conn)
close(input)
finish <- true
}
func (server *SocksServer) dumpOutput(conn net.Conn, output <-chan []byte, finish chan<- bool) {
for {
buffer, open := <-output
if !open {
finish <- true
log.Debug("Socks finishing output")
break
}
nBytes, err := conn.Write(buffer)
log.Debug("Writing %d bytes with error %v", nBytes, err)
}
v2net.ChanToWriter(conn, output)
finish <- true
}
func (server *SocksServer) waitForFinish(finish <-chan bool) {

34
net/transport.go Normal file
View File

@ -0,0 +1,34 @@
package net
import (
"io"
"github.com/v2ray/v2ray-core/log"
)
const (
bufferSize = 8192
)
func ReaderToChan(stream chan<- []byte, reader io.Reader) error {
for {
buffer := make([]byte, bufferSize)
nBytes, err := reader.Read(buffer)
if err != nil {
return err
}
stream <- buffer[:nBytes]
}
return nil
}
func ChanToWriter(writer io.Writer, stream <-chan []byte) error {
for buffer := range stream {
nBytes, err := writer.Write(buffer)
log.Debug("Writing %d bytes with error %v", nBytes, err)
if err != nil {
return err
}
}
return nil
}

View File

@ -1,5 +0,0 @@
package vmess
const (
BufferSize = 512
)

View File

@ -10,6 +10,7 @@ import (
v2io "github.com/v2ray/v2ray-core/io"
vmessio "github.com/v2ray/v2ray-core/io/vmess"
"github.com/v2ray/v2ray-core/log"
v2net "github.com/v2ray/v2ray-core/net"
)
type VMessInboundHandler struct {
@ -92,31 +93,14 @@ func (handler *VMessInboundHandler) HandleConnection(connection net.Conn) error
}
func (handler *VMessInboundHandler) dumpInput(reader io.Reader, input chan<- []byte, finish chan<- bool) {
for {
buffer := make([]byte, BufferSize)
nBytes, err := reader.Read(buffer)
log.Debug("VMessInbound: Reading %d bytes with error %v", nBytes, err)
if err == io.EOF {
close(input)
log.Debug("VMessInbound finishing input.")
finish <- true
break
}
input <- buffer[:nBytes]
}
v2net.ReaderToChan(input, reader)
close(input)
finish <- true
}
func (handler *VMessInboundHandler) dumpOutput(writer io.Writer, output <-chan []byte, finish chan<- bool) {
for {
buffer, open := <-output
if !open {
finish <- true
log.Debug("VMessInbound finishing output.")
break
}
nBytes, err := writer.Write(buffer)
log.Debug("VmessInbound: Wrote %d bytes with error %v", nBytes, err)
}
v2net.ChanToWriter(writer, output)
finish <- true
}
func (handler *VMessInboundHandler) waitForFinish(finish <-chan bool) {

View File

@ -118,31 +118,14 @@ func (handler *VMessOutboundHandler) startCommunicate(request *vmessio.VMessRequ
}
func (handler *VMessOutboundHandler) dumpOutput(reader io.Reader, output chan<- []byte, finish chan<- bool) {
for {
buffer := make([]byte, BufferSize)
nBytes, err := reader.Read(buffer)
log.Debug("VMessOutbound: Reading %d bytes, with error %v", nBytes, err)
if err == io.EOF {
close(output)
finish <- true
log.Debug("VMessOutbound finishing output.")
break
}
output <- buffer[:nBytes]
}
v2net.ReaderToChan(output, reader)
close(output)
finish <- true
}
func (handler *VMessOutboundHandler) dumpInput(writer io.Writer, input <-chan []byte, finish chan<- bool) {
for {
buffer, open := <-input
if !open {
finish <- true
log.Debug("VMessOutbound finishing input.")
break
}
nBytes, err := writer.Write(buffer)
log.Debug("VMessOutbound: Wrote %d bytes with error %v", nBytes, err)
}
v2net.ChanToWriter(writer, input)
finish <- true
}
func (handler *VMessOutboundHandler) waitForFinish(finish <-chan bool) {

View File

@ -8,7 +8,7 @@ import (
"github.com/v2ray/v2ray-core"
"github.com/v2ray/v2ray-core/log"
// The following are neccesary as they register handlers in their init functions.
// The following are neccesary as they register handlers in their init functions.
_ "github.com/v2ray/v2ray-core/net/freedom"
_ "github.com/v2ray/v2ray-core/net/socks"
_ "github.com/v2ray/v2ray-core/net/vmess"