/common-go

本人常用go代码块,仅供个人使用

Primary LanguageGo

common-go

提供了 xinzheng 常用的golang代码块

unix socket server

提供了基于 unix 套接字 服务的进程间通信,用于 client 对daemon程序交互。

example

package main

import(
    common "common-go"
    "flag"
    "log"
)

const SOCKET_FILE=".example.socket"

func main(){
    cmd := flag.String("s","","The signal for app")
    flag.Parse()
    server := common.NewUnixSocketServer(SOCKET_FILE)
    if *cmd != "start"{
        responseBody,err := server.Dail(*cmd)
        if err!=nil{
            log.Fatal(err)
        }else{
            log.Pringln(string(responseBody))
        }
        return
    }
    go func(){
        defer server.Stop()
        for{
            select{
                case <- server.Stoped():
                    return
                default:
                //do your daemon service
            }
        }
    }()

    if err := server.Listen();err!=nil{
        //stop you daemon if necessary
        log.Fatal(err)
    }
}

func NewUnixSocketServer(sockerfile string)

return *UnixSocketServer

返回默认服务。提供了,daemon服务起停和状态查询的功能。

type UnixSocketHandler func(*UnixSocketServer, net.Conn) error

func defaultsocketHandler(s *UnixSocketServer, c net.Conn) error {
	for {
		buf := make([]byte, 512)
		nr, err := c.Read(buf)
		if err != nil {
			return nil
		}

		data := buf[0:nr]
		switch string(data) {
		case "status":
			_, err = fmt.Fprintf(c, "running:%d", os.Getpid())
		case "stop":
			_, err = fmt.Fprintf(c, "stop:%d", os.Getpid())
			s.cannel()
		default:
			_, err = fmt.Fprintf(c, "invalid signal")
		}
		if err != nil {
			return err
		}
	}
}

NewUnixSocketServerWith(string,UnixSocketHandler)

return *UnixSocketServer

提供自定义handler方法

func(*UnixSocketHandler)Dial(string)

return []byte,error

给服务端传输命令,并等待返回

Listen

return error

开始监听套接字

Stop

服务端停止Listen

Stoped

等同于context.Context{}.Done()

ip_tools

这里包装来常用的IP操作

IPv4FromHex

将16进制的IP文本装为ipv4格式。之前主要用于/proc/net/ip_vs文件解析

func TestIpV4(t *testing.T) {
	ip, err := ipDecode("75952677")
	if err != nil {
		t.Fatal(err)
	}
    //print 117.149.38.119
	t.Log(ip)
}

GetInternalIP

获取内网IP,通过dial 10.255.255.255 实现

GetAllIP

获取网卡上所有IP地址,包括 IPV6,除了 127.0.0.1::1

Schedule

定时任务系统。在给定时间点通过channel返回给定值。当给定时间在当前时间之前时,cannel会立即返回该值。该服务thread safe

  • Add(time.Time,interface{}): 添加时间点

  • Stop(): 停止计时

  • Done() ←chan struct{}: 计时停止的cannel

  • Chan() ←chan interface{} : 定时出值的通道

  • Remove(interface{}): 删除特定值的时间点