|
package main |
|
|
|
import ( |
|
"log" |
|
"net" |
|
"os" |
|
"io" |
|
"encoding/binary" |
|
) |
|
|
|
const sockAddr = "./uds.sock" |
|
|
|
func main() { |
|
if _, err := os.Stat(sockAddr); err == nil { |
|
if err := os.Remove(sockAddr); err != nil { |
|
log.Printf("Remove socket file error: %v", err) |
|
} |
|
} |
|
|
|
sock, err := net.Listen("unix", sockAddr) |
|
if err != nil { |
|
log.Fatal("Listen error: ", err) |
|
} |
|
defer sock.Close() |
|
|
|
for { |
|
conn, err := sock.Accept() |
|
if err != nil { |
|
log.Fatal("Accept error: ", err) |
|
} |
|
log.Println("connection accepted.") |
|
|
|
go func(conn net.Conn) { |
|
lengthBuf := make([]byte, 4) |
|
for { |
|
len, err := conn.Read(lengthBuf) |
|
if err != nil || len != 4 { |
|
if err == io.EOF { |
|
log.Println("end of file") |
|
break |
|
} |
|
log.Fatal("read buffer error", err, len) |
|
} |
|
length := binary.BigEndian.Uint32(lengthBuf) |
|
// log.Println("length:", length) |
|
dataBuf := make([]byte, length) |
|
|
|
var start, count int |
|
for { |
|
if count, err = conn.Read(dataBuf[start:]); err != nil { |
|
log.Fatal("read buffer error", err) |
|
} |
|
start += count |
|
if count == 0 || start == int(length) { |
|
break |
|
} |
|
} |
|
|
|
_, err = conn.Write(lengthBuf) |
|
if err != nil { |
|
log.Fatal("Send to client error: ", err) |
|
} |
|
_, err = conn.Write(dataBuf) |
|
if err != nil { |
|
log.Fatal("Send to client error: ", err) |
|
} |
|
} |
|
}(conn) |
|
} |
|
} |