Files
engine/util/socket.go
2022-02-02 10:39:39 +08:00

93 lines
2.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package util
import (
"log"
"net"
"net/http"
"os"
"time"
"golang.org/x/sync/errgroup"
)
// ListenAddrs Listen http and https
func ListenAddrs(addr, addTLS, cert, key string, handler http.Handler) {
var g errgroup.Group
if addTLS != "" {
g.Go(func() error {
return http.ListenAndServeTLS(addTLS, cert, key, handler)
})
}
if addr != "" {
g.Go(func() error { return http.ListenAndServe(addr, handler) })
}
if err := g.Wait(); err != nil {
log.Fatal(err)
}
}
func ListenTCP(addr string, process func(net.Conn)) error {
listener, err := net.Listen("tcp", addr)
if err != nil {
return err
}
var tempDelay time.Duration
for {
conn, err := listener.Accept()
conn.(*net.TCPConn).SetNoDelay(false)
if err != nil {
if ne, ok := err.(net.Error); ok && ne.Temporary() {
if tempDelay == 0 {
tempDelay = 5 * time.Millisecond
} else {
tempDelay *= 2
}
if max := 1 * time.Second; tempDelay > max {
tempDelay = max
}
Printf("%s: Accept error: %v; retrying in %v", addr, err, tempDelay)
time.Sleep(tempDelay)
continue
}
return err
}
tempDelay = 0
go process(conn)
}
}
func ListenUDP(address string, networkBuffer int) (*net.UDPConn, error) {
addr, err := net.ResolveUDPAddr("udp", address)
if err != nil {
log.Fatalf("udp server ResolveUDPAddr :%s error, %v", address, err)
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
log.Fatalf("udp server ListenUDP :%s error, %v", address, err)
}
if err = conn.SetReadBuffer(networkBuffer); err != nil {
Printf("udp server video conn set read buffer error, %v", err)
}
if err = conn.SetWriteBuffer(networkBuffer); err != nil {
Printf("udp server video conn set write buffer error, %v", err)
}
return conn, err
}
func CORS(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Credentials", "true")
origin := r.Header["Origin"]
if len(origin) == 0 {
w.Header().Set("Access-Control-Allow-Origin", "*")
} else {
w.Header().Set("Access-Control-Allow-Origin", origin[0])
}
}
// 检查文件或目录是否存在
// 如果由 filename 指定的文件或目录存在则返回 true否则返回 false
func Exist(filename string) bool {
_, err := os.Stat(filename)
return err == nil || os.IsExist(err)
}