├── go.mod ├── .gitignore ├── main.go ├── dll.go └── handel.go /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/CodFrm/cxmooc-vcode 2 | 3 | go 1.12 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, build with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | 14 | *.jpg 15 | 16 | .idea -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "C" 5 | "net" 6 | "os" 7 | ) 8 | 9 | func main() { 10 | if err := InitDll(); err != nil { 11 | println("Identification module failed to load: ", err.Error()) 12 | return 13 | } 14 | if err := InitHandel(); err != nil { 15 | println("Handel init error: ", err.Error()) 16 | return 17 | } 18 | //开启服务 19 | server, err := net.Listen("tcp", ":5208") 20 | if err != nil { 21 | println("Server start error: ", err.Error()) 22 | return 23 | } 24 | defer server.Close() 25 | println("Service start...") 26 | for { 27 | conn, err := server.Accept() 28 | if err != nil { 29 | println("Error accepting: ", err.Error()) 30 | os.Exit(1) 31 | } 32 | go HandelRequest(conn) 33 | } 34 | println("Service stop") 35 | } 36 | -------------------------------------------------------------------------------- /dll.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "syscall" 5 | "unsafe" 6 | ) 7 | 8 | var dll syscall.Handle 9 | var initFun uintptr 10 | var ocrFunc uintptr 11 | 12 | func InitDll() error { 13 | var err error 14 | dll, err = syscall.LoadLibrary("ocr.dll") 15 | if err != nil { 16 | return err 17 | } 18 | initFun, err = syscall.GetProcAddress(dll, "init") 19 | if err != nil { 20 | return err 21 | } 22 | syscall.Syscall(initFun, 0, 0, 0, 0) 23 | ocrFunc, err = syscall.GetProcAddress(dll, "ocr") 24 | if err != nil { 25 | return err 26 | } 27 | return nil 28 | } 29 | 30 | func ocr(img *[]byte) string { 31 | p := *((*int32)(unsafe.Pointer(img))) 32 | ret, _, _ := syscall.Syscall(ocrFunc, 2, uintptr(p), uintptr(len(*img)), 0) 33 | return prttostr(ret) 34 | } 35 | 36 | func prttostr(vcode uintptr) string { 37 | if vcode <= 0 { 38 | return "" 39 | } 40 | var vbyte []byte 41 | for { 42 | sbyte := *((*byte)(unsafe.Pointer(vcode))) 43 | if sbyte == 0 { 44 | break 45 | } 46 | vbyte = append(vbyte, sbyte) 47 | vcode += 1 48 | } 49 | return string(vbyte) 50 | } 51 | -------------------------------------------------------------------------------- /handel.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "encoding/binary" 6 | "io" 7 | "net" 8 | "runtime" 9 | "time" 10 | ) 11 | 12 | type Packgee struct { 13 | Conn net.Conn 14 | Version [4]byte 15 | Len int32 16 | Tag [8]byte 17 | Time int64 18 | Data []byte 19 | } 20 | 21 | var ch chan *Packgee 22 | 23 | func InitHandel() error { 24 | ch = make(chan *Packgee, 100) 25 | runtime.GOMAXPROCS(4) 26 | for i := 0; i < 10; i++ { 27 | go handelPackOcr() 28 | } 29 | return nil 30 | } 31 | 32 | //处理客户端连接请求 33 | func HandelRequest(conn net.Conn) { 34 | defer conn.Close() 35 | var tempPack = make([]byte, 0, 4096) 36 | for { 37 | buf := make([]byte, 4096) 38 | readlen, err := conn.Read(buf) 39 | if err != nil { 40 | println("Client error: ", err.Error()) 41 | break 42 | } 43 | tempPack = append(tempPack, buf[:readlen]...) 44 | if tempPack[0] == 'v' && len(tempPack) >= 8 { 45 | pack, err := unpack(bytes.NewReader(tempPack)) 46 | if err == nil { 47 | pack.Conn = conn 48 | tempPack = tempPack[pack.Len:] 49 | ch <- pack 50 | } else { 51 | println("unpack err: ", err.Error()) 52 | } 53 | } else if len(tempPack) > 1048576 { 54 | //大于1m的数据关闭客户链接 55 | break 56 | } 57 | } 58 | } 59 | 60 | func unpack(io io.Reader) (*Packgee, error) { 61 | var err error 62 | ret := Packgee{} 63 | err = binary.Read(io, binary.BigEndian, &ret.Version) 64 | err = binary.Read(io, binary.BigEndian, &ret.Len) 65 | err = binary.Read(io, binary.BigEndian, &ret.Tag) 66 | err = binary.Read(io, binary.BigEndian, &ret.Time) 67 | ret.Data = make([]byte, ret.Len-24) 68 | err = binary.Read(io, binary.BigEndian, &ret.Data) 69 | return &ret, err 70 | } 71 | 72 | func pack(pack *Packgee) ([]byte, error) { 73 | pack.Len = int32(24 + len(pack.Data)) 74 | pack.Time = time.Now().Unix() 75 | var ret = make([]byte, pack.Len) 76 | var err error 77 | io := new(bytes.Buffer) 78 | err = binary.Write(io, binary.BigEndian, &pack.Version) 79 | err = binary.Write(io, binary.BigEndian, &pack.Len) 80 | err = binary.Write(io, binary.BigEndian, &pack.Tag) 81 | err = binary.Write(io, binary.BigEndian, &pack.Time) 82 | err = binary.Write(io, binary.BigEndian, &pack.Data) 83 | _, err = io.Read(ret) 84 | return ret, err 85 | } 86 | 87 | //处理ocr识别包请求 88 | func handelPackOcr() { 89 | for recvPack := range ch { 90 | ret := ocr(&recvPack.Data) 91 | recvPack.Data = []byte(ret) 92 | send, err := pack(recvPack) 93 | if err != nil { 94 | println("pack err: ", err.Error()) 95 | recvPack.Conn.Close() 96 | continue 97 | } 98 | sendLen, err := recvPack.Conn.Write(send) 99 | if err != nil || int32(sendLen) != recvPack.Len { 100 | println("send err: ", sendLen, recvPack.Len) 101 | recvPack.Conn.Close() 102 | continue 103 | } 104 | } 105 | } 106 | --------------------------------------------------------------------------------