在软件开发的工作中,不同编程语言有着各自独特的优势。有时候,为了充分发挥这些优势,我们需要让它们携手合作。本文将详细介绍如何使用 VC++ 调用 Golang 编写的 HTTP 文件传输服务,通过这种跨语言的协作,实现高效的文件传输功能。
项目背景与需求分析
在笔者一个项目,用VC++开发的程序需要用到一个HTTP文件服务。如果用VC++来写可能有些复杂,而golang构建一个稳定高效的HTTP文件传输服务比较容易且高效。因此,将两者结合起来,利用 Golang 构建 HTTP 文件传输服务,再通过 VC++ 进行调用,是一个非常不错的选择。
项目结构与代码实现
1. Golang 部分:构建 HTTP 文件传输服务
我们使用 Golang 编写了一个名为HttpFileServer.go的文件,它包含了 HTTP 文件上传和下载的核心逻辑。以下是该文件的主要内容:
package main
import (
"C"
"crypto/rand"
_ "encoding/base64"
"fmt"
"io"
"io/ioutil"
"log"
_ "mime"
"net/http"
"net/url"
"os"
"os/exec"
"path/filepath"
"runtime"
"strconv"
"strings"
)
import "os/signal"
const maxUploadSize = 1024 * 1024 * 1024
const uploadPath = "/upload"
const downloadPath = "/download"
var gDownFileMap map[string]string
var server *http.Server
//export StartHTTPServer
func StartHTTPServer() {
runtime.GOMAXPROCS(runtime.NumCPU())
downfolderPath := filepath.Join(getCurrentPath(), downloadPath)
os.MkdirAll(downfolderPath, os.ModePerm)
upfolderPath := filepath.Join(getCurrentPath(), uploadPath)
os.MkdirAll(upfolderPath, os.ModePerm)
gDownFileMap = make(map[string]string)
log.SetFlags(log.LstdFlags | log.Lshortfile)
file, err := os.Create(filepath.Join(getCurrentPath(), "hfs.log"))
if err != nil {
log.Println("| hfs create log file error: ", err)
} else {
defer file.Close()
writers := []io.Writer{
file,
os.Stdout,
}
log.SetOutput(io.MultiWriter(writers...))
}
// 一个通知退出的chan
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
go func() {
// 接收退出信号
<-quit
if err := server.Close(); err != nil {
log.Println("| hfs::StartHTTPServerClose server:", err)
}
}()
server := &http.Server{
Addr: ":8080",
}
http.HandleFunc("/upload", uploadFileHandler)
http.HandleFunc("/upload/", uploadFileHandler)
http.HandleFunc("/download/", downloadFileHandler)
log.Println("| hfs::StartHTTPServer download:", downfolderPath, ", upload:", upfolderPath)
log.Print("| hfs::StartHTTPServer Started Listen Port:8080, use /upload/ for uploading files and /download/{fileName} for downloading")
err = server.ListenAndServe()
if err != nil {
log.Println("| hfs::StartHTTPServer http server error: ", err)
}
}
//export StopHTTPServer
func StopHTTPServer() {
err := server.Shutdown(nil)
if err != nil {
log.Println("| hfs::StopHTTPServer shutdown the server err: ", err)
}
}
//export Updat

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



