|
@@ -0,0 +1,157 @@
|
|
|
+package network
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "net"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+
|
|
|
+type ConnectionReadOptions func(conn net.Conn) error
|
|
|
+
|
|
|
+
|
|
|
+func WithReadDeadline(duration time.Duration) ConnectionReadOptions {
|
|
|
+ return func(conn net.Conn) error {
|
|
|
+ err := conn.SetReadDeadline(time.Now().Add(duration))
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+type ConnectionWriteOptions func(conn net.Conn) error
|
|
|
+
|
|
|
+
|
|
|
+func WithWriteDeadline(duration time.Duration) ConnectionWriteOptions {
|
|
|
+ return func(conn net.Conn) error {
|
|
|
+ err := conn.SetWriteDeadline(time.Now().Add(duration))
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func ReadUDP(conn *net.UDPConn, bufferSize int, opts ...ConnectionReadOptions) ([]byte, *net.UDPAddr, error) {
|
|
|
+ buffer := make([]byte, bufferSize)
|
|
|
+
|
|
|
+ for _, opt := range opts {
|
|
|
+ err := opt(conn)
|
|
|
+ if err != nil {
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ n, rAddr, err := conn.ReadFromUDP(buffer)
|
|
|
+ if err != nil {
|
|
|
+ return nil, nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ return buffer[:n], rAddr, nil
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func WriteUDPWithRemoteAddr(conn *net.UDPConn, rAddr *net.UDPAddr, data []byte, opts ...ConnectionWriteOptions) error {
|
|
|
+ for _, opt := range opts {
|
|
|
+ err := opt(conn)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err := conn.WriteToUDP(data, rAddr)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func WriteUDP(conn *net.UDPConn, data []byte, opts ...ConnectionWriteOptions) error {
|
|
|
+ for _, opt := range opts {
|
|
|
+ err := opt(conn)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ _, err := conn.Write(data)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func ReadTCP(conn net.Conn, bufferSize int, readCallback func(data []byte) (bool, error), opts ...ConnectionReadOptions) error {
|
|
|
+ for {
|
|
|
+ buffer := make([]byte, bufferSize)
|
|
|
+
|
|
|
+ for _, opt := range opts {
|
|
|
+ err := opt(conn)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ n, err := conn.Read(buffer)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if n != 0 {
|
|
|
+ readOver, err := readCallback(buffer[:n])
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ if readOver {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func WriteTCP(conn net.Conn, data []byte, opts ...ConnectionWriteOptions) error {
|
|
|
+ writeBytesCount := 0
|
|
|
+
|
|
|
+ for {
|
|
|
+ for _, opt := range opts {
|
|
|
+ err := opt(conn)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ n, err := conn.Write(data[writeBytesCount:])
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ writeBytesCount += n
|
|
|
+ if writeBytesCount < len(data) {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+func CloseConnection(conn net.Conn) {
|
|
|
+ err := conn.Close()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("Close Connection Error:", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ conn = nil
|
|
|
+}
|