golang 并行转串行透明代理
来源:互联网 发布:sql组合主键 编辑:程序博客网 时间:2024/06/11 17:55
放在这里做个备份
package mainimport ("fmt""log""net")const (realServer = "127.0.0.1:9002"selfPort = 9010)type gameConn struct {ClientConn net.ConnPkgBuf [maxPkgSize]bytePkgLen intChannel chan int}var gbChannel chan intvar connMap map[int](*gameConn)func main() {// Listen on TCP port 2000 on all interfaces.ip := net.ParseIP("0.0.0.0")addr := net.TCPAddr{ip, selfPort}l, err := net.ListenTCP("tcp", &addr)if err != nil {log.Fatal(err)}serverConn, err := net.Dial("tcp", realServer)if err != nil {fmt.Println(err)return}log.Printf("starting server...")gbChannel = make(chan int)connMap = make(map[int](*gameConn))index := 0go redisProcess(serverConn)for {// Wait for a connection.conn, err := l.AcceptTCP()if err != nil {log.Fatal(err)}go start(conn, index)index++}}
package mainimport ("fmt""net")const (maxPkgSize = (4 * 1024 * 1024))func start(netConn net.Conn, id int) {connInfo := new(gameConn)connInfo.ClientConn = netConnconnInfo.Channel = make(chan int)connMap[id] = connInfovar err errorconnInfo.PkgLen, err = netConn.Read(connInfo.PkgBuf[:])if err != nil {fmt.Println(err)return} else if connInfo.PkgLen >= maxPkgSize {fmt.Printf("too long:%i\n", connInfo.PkgLen)} else {//fmt.Printf("length:%i\n", length)}gbChannel <- idfor {<-connInfo.ChannelconnInfo.PkgLen, err = netConn.Read(connInfo.PkgBuf[:])if err != nil {fmt.Println(err)return} else if connInfo.PkgLen >= maxPkgSize {fmt.Printf("too long:%i\n", connInfo.PkgLen)} else {//fmt.Printf("length:%i\n", length)}gbChannel <- id}}func redisProcess(serverConn net.Conn) {var pGameConn *gameConnvar id intfor {id = <-gbChannelpGameConn = connMap[id]if pGameConn == nil {continue}length, err := serverConn.Write(pGameConn.PkgBuf[:pGameConn.PkgLen])if err != nil {fmt.Println(err)continue}length, err = serverConn.Read(pGameConn.PkgBuf[:])if err != nil {fmt.Println(err)continue} else if length >= maxPkgSize {fmt.Printf("too long:%i\n", length)} else {//fmt.Printf("length:%i\n", length)}length, err = pGameConn.ClientConn.Write(pGameConn.PkgBuf[:length])if err != nil {fmt.Println(err)continue}pGameConn.Channel <- 1}}
- golang 并行转串行透明代理
- 74HC165并行数据转串行数据
- 并行和串行通信
- 并行和串行计算
- 并行传输,串行传输
- 串行与并行
- 串行与并行
- 串行和并行区别
- 串行算法并行化
- 串行 并行 同步 异步
- gcd并行串行
- 同步 异步 并行 串行
- 同步 异步 串行 并行
- GCD 之串行、并行
- quartz任务串行并行
- 串行还是并行
- 串行程序并行化
- quartz任务串行并行
- <MSDN笔记> Lambda 表达式中的变量作用域
- Linux下的sudo及其配置文件/etc/sudoers的详细配置说明
- 【Java类集】_ListIterator接口笔记(实例亲测)
- C语言文件操作之fgets()
- hostapd
- golang 并行转串行透明代理
- 取本地相册,保存到项目
- ORA-12519: TNS:no appropriate service handler found 解决
- (C#)检索出一个字符串中某字符第n次出现的位置(IndexOf)
- 参考苹果对方法的命名的规范
- 主数据管理功能模块、实施、提供厂商
- “Incorrect Architecture” when trying to install iPhone app onto my development device
- android 优化内存溢出之三
- 链表实现