You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
284 lines
6.3 KiB
Go
284 lines
6.3 KiB
Go
3 years ago
|
package icsnet
|
||
|
|
||
|
import (
|
||
|
"net"
|
||
|
"strings"
|
||
|
"time"
|
||
|
|
||
|
"gitlab.com/ics_cinnamon/voiceStatistics/icsconf"
|
||
|
"gitlab.com/ics_cinnamon/voiceStatistics/icserror"
|
||
|
"gitlab.com/ics_cinnamon/voiceStatistics/icslog"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
NET_BUFFER_LENGTH = 4096
|
||
|
)
|
||
|
|
||
|
type IcsTCPNet struct {
|
||
|
laddr *IcsNetAddr
|
||
|
raddr *IcsNetAddr
|
||
|
conn *IcsConn
|
||
|
listener *net.TCPListener
|
||
|
}
|
||
|
|
||
|
func NewTCP(laddr, raddr *IcsNetAddr) (tcpnet *IcsTCPNet) {
|
||
|
tcpnet = &IcsTCPNet{
|
||
|
laddr: laddr,
|
||
|
raddr: raddr,
|
||
|
conn: &IcsConn{},
|
||
|
}
|
||
|
|
||
|
return tcpnet
|
||
|
}
|
||
|
|
||
|
func (t *IcsTCPNet) Listen() *icserror.IcsError {
|
||
|
addr, err := t.laddr.ResolveIcsNetAddr("tcp")
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
var aerr error
|
||
|
switch v := addr.(type) {
|
||
|
case net.TCPAddr:
|
||
|
t.listener, aerr = net.ListenTCP("tcp", &v)
|
||
|
if aerr != nil {
|
||
|
icserror.ICSERRNETListenError.SetError(aerr)
|
||
|
return icserror.ICSERRNETListenError
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (t *IcsTCPNet) Accept() (conn *net.TCPConn, ierr *icserror.IcsError) {
|
||
|
var err error
|
||
|
if t.listener != nil {
|
||
|
conn, err = t.listener.AcceptTCP()
|
||
|
//t.conn.ICSTCPConn, err = t.listener.AcceptTCP()
|
||
|
if err != nil {
|
||
|
icserror.ICSERRNETAcceptError.SetError(err)
|
||
|
return nil, icserror.ICSERRNETAcceptError
|
||
|
}
|
||
|
} else {
|
||
|
return nil, icserror.ICSERRNETAcceptError
|
||
|
}
|
||
|
|
||
|
return conn, nil
|
||
|
}
|
||
|
|
||
|
func (t *IcsTCPNet) Connect(localAddr, remoteAddr *IcsNetAddr) *icserror.IcsError {
|
||
|
if remoteAddr != nil {
|
||
|
t.raddr = remoteAddr
|
||
|
}
|
||
|
raddr, rerr := t.raddr.ResolveIcsNetAddr("tcp")
|
||
|
if rerr != nil {
|
||
|
return rerr
|
||
|
}
|
||
|
|
||
|
var aerr error
|
||
|
switch v := raddr.(type) {
|
||
|
case net.TCPAddr:
|
||
|
t.conn.ICSTCPConn, aerr = net.DialTCP("tcp", nil, &v)
|
||
|
if aerr != nil {
|
||
|
icserror.ICSERRNETConnectError.SetError(aerr)
|
||
|
return icserror.ICSERRNETConnectError
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (t *IcsTCPNet) Close() *icserror.IcsError {
|
||
|
if t.conn.ICSTCPConn == nil {
|
||
|
return icserror.ICSERRNETNotConnectError
|
||
|
}
|
||
|
|
||
|
aerr := t.conn.ICSTCPConn.Close()
|
||
|
if aerr != nil {
|
||
|
icserror.ICSERRNETNotConnectError.SetError(aerr)
|
||
|
return icserror.ICSERRNETNotConnectError
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (t *IcsTCPNet) Write(b []byte) (int, *icserror.IcsError) {
|
||
|
if t.conn.ICSTCPConn == nil {
|
||
|
return 0, icserror.ICSERRNETNotConnectError
|
||
|
}
|
||
|
|
||
|
wsize, err := t.conn.ICSTCPConn.Write(b)
|
||
|
if err != nil {
|
||
|
icserror.ICSERRNETWriteError.SetError(err)
|
||
|
return -1, icserror.ICSERRNETWriteError
|
||
|
}
|
||
|
|
||
|
return wsize, nil
|
||
|
}
|
||
|
|
||
|
func (u *IcsTCPNet) WriteSIP(b []byte) (int, *icserror.IcsError) {
|
||
|
return 0, nil
|
||
|
}
|
||
|
|
||
|
func (u *IcsTCPNet) WriteRTP(b []byte) (int, *icserror.IcsError) {
|
||
|
return 0, nil
|
||
|
}
|
||
|
|
||
|
func (t *IcsTCPNet) Read(size int) ([]byte, int, *icserror.IcsError) {
|
||
|
var rlen int = 0
|
||
|
buf := make([]byte, size)
|
||
|
|
||
|
for rlen = 0; ; {
|
||
|
len, err := t.conn.ICSTCPConn.Read(buf[rlen:])
|
||
|
//len, err := t.conn.ICSTCPConn.Read(buf)
|
||
|
if err == nil {
|
||
|
rlen += len
|
||
|
if rlen >= size {
|
||
|
return buf, rlen, nil
|
||
|
}
|
||
|
} else {
|
||
|
icserror.ICSERRNETReadError.SetError(err)
|
||
|
return nil, -1, icserror.ICSERRNETReadError
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (t *IcsTCPNet) ReadS(length int, lineEnd string) ([]byte, int, *icserror.IcsError) {
|
||
|
var rlen int = 0
|
||
|
size := NET_BUFFER_LENGTH
|
||
|
if length > 0 {
|
||
|
size = length
|
||
|
}
|
||
|
buf := make([]byte, size)
|
||
|
//fmt.Println("Reads make size:", size, "buf size:", len(buf))
|
||
|
|
||
|
for rlen = 0; ; {
|
||
|
rbuf := make([]byte, size)
|
||
|
len, err := t.conn.ICSTCPConn.Read(rbuf)
|
||
|
if err == nil {
|
||
|
rlen += len
|
||
|
copy(buf[:rlen], rbuf)
|
||
|
if rlen >= size {
|
||
|
return buf, rlen, nil
|
||
|
} else if strings.Contains(string(buf), lineEnd) {
|
||
|
return buf, rlen, nil
|
||
|
}
|
||
|
} else {
|
||
|
icserror.ICSERRNETReadError.SetError(err)
|
||
|
return nil, -1, icserror.ICSERRNETReadError
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (u *IcsTCPNet) ReadSIP() ([]byte, *net.UDPAddr, int, *icserror.IcsError) {
|
||
|
return nil, nil, 0, nil
|
||
|
}
|
||
|
|
||
|
func (u *IcsTCPNet) ReadRTP() ([]byte, *net.UDPAddr, int, *icserror.IcsError) {
|
||
|
return nil, nil, 0, nil
|
||
|
}
|
||
|
|
||
|
func (t *IcsTCPNet) LocalAddr() net.Addr {
|
||
|
return t.conn.ICSTCPConn.LocalAddr()
|
||
|
}
|
||
|
|
||
|
func (t *IcsTCPNet) RemoteAddr() net.Addr {
|
||
|
return t.conn.ICSTCPConn.RemoteAddr()
|
||
|
}
|
||
|
|
||
|
func (t *IcsTCPNet) SetRemoteAddr(raddr *IcsNetAddr) {
|
||
|
t.raddr = raddr
|
||
|
}
|
||
|
|
||
|
// func (t *IcsTCPNet) SetLinger(sec int) {
|
||
|
// t.conn.ICSTCPConn.SetLinger(sec)
|
||
|
// }
|
||
|
|
||
|
func (t *IcsTCPNet) SetLinger() {
|
||
|
conf := icsconf.GetIcsConfig()
|
||
|
t.conn.ICSTCPConn.SetLinger(conf.Linger)
|
||
|
}
|
||
|
|
||
|
func (t *IcsTCPNet) SetDeadline(sec int64) {
|
||
|
t.conn.ICSTCPConn.SetDeadline(time.Now().Add(time.Second * time.Duration(sec)))
|
||
|
}
|
||
|
|
||
|
func (t *IcsTCPNet) SetWriteDeadline(sec int64) {
|
||
|
t.conn.ICSTCPConn.SetWriteDeadline(time.Now().Add(time.Second * time.Duration(sec)))
|
||
|
}
|
||
|
|
||
|
func (t *IcsTCPNet) SetReadDeadline(sec int64) {
|
||
|
t.conn.ICSTCPConn.SetReadDeadline(time.Now().Add(time.Second * time.Duration(sec)))
|
||
|
}
|
||
|
|
||
|
func SendCallSignal(laddr, raddr *IcsNetAddr, buf []byte) (t *IcsTCPNet, sendlen int, err *icserror.IcsError) {
|
||
|
t = NewTCP(laddr, raddr)
|
||
|
//connect to VoiceAgent
|
||
|
err = t.Connect(laddr, raddr)
|
||
|
if err != nil {
|
||
|
return nil, -1, err
|
||
|
}
|
||
|
//defer t.Close()
|
||
|
|
||
|
// t.SetLinger(1)
|
||
|
t.SetLinger()
|
||
|
t.SetDeadline(180)
|
||
|
|
||
|
//send call signal
|
||
|
sendlen, err = t.Write(buf)
|
||
|
if err != nil {
|
||
|
return nil, -1, err
|
||
|
}
|
||
|
|
||
|
return t, sendlen, err
|
||
|
}
|
||
|
|
||
|
//func ListenAndServeTCP(laddr, raddr *IcsNetAddr, bufend string, f func(*net.TCPConn, string)) (t *IcsTCPNet, err *icserror.IcsError) {
|
||
|
func ListenAndServeTCP(laddr, raddr *IcsNetAddr, bufend string, f func(*IcsTCPNet, string)) (t *IcsTCPNet, err *icserror.IcsError) {
|
||
|
t = NewTCP(laddr, raddr)
|
||
|
err = t.Listen()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
//defer t.listener.Close()
|
||
|
|
||
|
l := icslog.GetIcsLog()
|
||
|
go func() {
|
||
|
//fmt.Printf("Started TCP Listen - %s\n", laddr.String())
|
||
|
l.Printf(icslog.LOG_LEVEL_INFO, -1, "Started TCP Listen - %s", laddr.String())
|
||
|
|
||
|
for {
|
||
|
var conn *net.TCPConn
|
||
|
var accepterr *icserror.IcsError
|
||
|
if conn, accepterr = t.Accept(); accepterr != nil {
|
||
|
//if accepterr := t.Accept(); accepterr != nil {
|
||
|
continue
|
||
|
}
|
||
|
newT := NewTCP(nil, nil)
|
||
|
newT.conn.ICSTCPConn = conn
|
||
|
// newT.SetLinger(1)
|
||
|
newT.SetLinger()
|
||
|
newT.SetDeadline(180)
|
||
|
l.Printf(icslog.LOG_LEVEL_DEBUG, -1, "Connected - [%s][%s]", conn.LocalAddr(), conn.RemoteAddr())
|
||
|
//go f(conn, bufend)
|
||
|
go f(newT, bufend)
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (t *IcsTCPNet) CloseListener() *icserror.IcsError {
|
||
|
if t.listener == nil {
|
||
|
return icserror.ICSERRNETNotConnectError
|
||
|
}
|
||
|
|
||
|
aerr := t.listener.Close()
|
||
|
if aerr != nil {
|
||
|
icserror.ICSERRNETNotConnectError.SetError(aerr)
|
||
|
return icserror.ICSERRNETNotConnectError
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|