golang编写http server dll

·

package main

// //Needed for build
import "C"
import (
	"fmt"
	"io"
	"net/http"
)

func homeHandler(w http.ResponseWriter, r *http.Request) {
	header := fmt.Sprintf("%s %s %s\r\n", r.Method, r.RequestURI, r.Proto)
	header += fmt.Sprintf("Host: %s\r\n", r.Host)
	for k, vs := range r.Header {
		header += fmt.Sprintf("%s: ", k)
		for _, v := range vs {
			header += v
		}
		header += "\r\n"
	}
	header += "\r\n"
	fmt.Fprintf(w, "%s", header)
	body, err := io.ReadAll(io.Reader(r.Body))
	if err != nil {
		http.Error(w, "Error reading request body", http.StatusInternalServerError)
		return
	}
	w.Write(body)
}

//export main
func main() {
	http.HandleFunc("/", homeHandler)
	http.ListenAndServe(":8000", nil)
}

关于HTTP Server

通过在CreateIoCompletionPort函数上设置断点,测试出以下两种情况:

  1. HTTP Server程序会触发断点。
  2. Hello World程序不会触发断点。

基本可以判定golang net/http在Windows上使用了IOCP,性能应该是还不错。

关于编译成DLL

使用命令

go build -a -o dllmain.dll -buildmode=c-shared server.go

go build -a -ldflags "-s -w" -o dllmain.dll -buildmode=c-shared server.go

其中-s为压缩,-w为去掉调试信息,同时指定这两个选项很可能会被Windows Defender报毒。

关于导出函数

需要满足以下两个条件,缺一不可。

  1. 必须引入import “C”
  2. 在导出函数前添加注释//export 函数名,如本例中的//export main,这个格式要求比较严格,//export之间不能有空格。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注