local_socket/server_windows.go
2017-10-24 11:57:54 +09:00

101 lines
1.6 KiB
Go

package local_socket
import (
"errors"
"fmt"
"net"
"sync"
"gopkg.in/natefinch/npipe.v2"
)
type LocalServer struct {
path string
callback func(socket net.Conn)
listener *npipe.PipeListener
wg sync.WaitGroup
}
func NewLocalServer(pathName string) *LocalServer {
return &LocalServer{
path: `\\.\pipe\` + pathName,
}
}
func (s *LocalServer) ListenAndServe() error {
if s.callback == nil {
return errors.New("no callback specified")
}
s.wg.Wait()
var err error
s.listener, err = npipe.Listen(s.path)
if err != nil {
return err
}
defer s.listener.Close()
s.wg.Add(1)
defer func() {
s.wg.Done()
s.listener.Close()
}()
for {
conn, err := s.listener.AcceptPipe()
if conn == nil {
return StoppedError
}
if err == nil {
s.wg.Add(1)
go func() {
s.callback(newLocalSocket(conn))
s.wg.Done()
}()
continue
}
println(err.Error())
s.wg.Done()
return err
}
}
func (s *LocalServer) Listen() error {
s.wg.Wait()
if s.callback == nil {
return errors.New("no callback specified")
}
var err error
s.listener, err = npipe.Listen(s.path)
if err != nil {
return err
}
s.wg.Add(1)
go func() {
defer func() {
s.wg.Done()
err := s.listener.Close()
fmt.Println(err)
}()
for {
conn, err := s.listener.AcceptPipe()
// check channel is still opening
if conn == nil {
return
}
if err == nil {
s.wg.Add(1)
go func() {
s.callback(newLocalSocket(conn))
s.wg.Done()
}()
continue
}
println("error")
panic(err)
}
}()
return nil
}
func (s *LocalServer) Close() {
s.listener.Close()
}