VC++ 与 Golang 的协作:实现 HTTP 文件传输服务

在软件开发的工作中,不同编程语言有着各自独特的优势。有时候,为了充分发挥这些优势,我们需要让它们携手合作。本文将详细介绍如何使用 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mxpan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值