微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从共享库运行服务器

如何解决从共享库运行服务器

尝试从共享库运行 servr,因此我执行了以下操作:

  1. 将共享库编写为:
// server.go
package main

import (
    "fmt"
    "net/http"
)
import "C"

func hello(w http.ResponseWriter,req *http.Request) {
    fmt.Fprintf(w,"hello\n")
}
func headers(w http.ResponseWriter,req *http.Request) {
    for name,headers := range req.Header {
        for _,h := range headers {
            fmt.Fprintf(w,"%v: %v\n",name,h)
        }
    }
}
func main() {}

// export Run server
func Run(port string) {
    http.HandleFunc("/hello",hello)
    http.HandleFunc("/headers",headers)
    if err := http.ListenAndServe("localhost:"+port,nil); err == nil {
        fmt.Println("listening to 8090")
    } else {
        fmt.Println("ListenAndServe: ",err)
    }
}
  1. 将共享库编译为:
$ go build -buildmode c-shared -o server.so server.go
  1. 将共享库中调用 Run 函数的主文件写成:
//main.go
package main

/*
#cgo LDFLAGS: -ldl
#include <dlfcn.h>

void Run(char* port){}

*/
import "C"

func main() {
    // handle := C.dlopen(C.CString("server.so"),C.RTLD_LAZY)
    // C.dlsym(handle,C.CString("8090"))

    C.dlopen(C.CString("server.so"),C.RTLD_LAZY)
    C.run(C.CString("8090"))
}
  1. 运行主文件
$ go run main.go

main函数已经直接终止了,srver还没有在http://localhost:8090/hello运行

解决方法

你为什么不把它分成一个go包(例如:包服务器)和导入这个包的主应用程序:

您的项目/cmd/server/main.go

package main

import (
    "yourproject/internal/server"
)

func main() {
    srv := server.New()
    // ...
    port := "8443"
    // do some logic here

    srv.Run(port)
}

yourproject/internal/server/server.go

package server

import (
    "fmt"
    "net/http"
)
import "C"

type Server struct{}

func New() *Server {
    return &Server{}
}

func hello(w http.ResponseWriter,req *http.Request) {
    fmt.Fprintf(w,"hello\n")
}

func headers(w http.ResponseWriter,req *http.Request) {
    for name,headers := range req.Header {
        for _,h := range headers {
            fmt.Fprintf(w,"%v: %v\n",name,h)
        }
    }
}

// export Run server
func (s *Server) Run(port string) {
    http.HandleFunc("/hello",hello)
    http.HandleFunc("/headers",headers)
    if err := http.ListenAndServe("localhost:"+port,nil); err == nil {
        fmt.Println("listening to 8090")
    } else {
        fmt.Println("ListenAndServe: ",err)
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。