filling code for client-side control channel
This commit is contained in:
		
							
								
								
									
										45
									
								
								client.go
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								client.go
									
									
									
									
									
								
							@ -30,6 +30,11 @@ type ClientConfig struct {
 | 
			
		||||
	PeerAddrs []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ClientConfigActive struct {
 | 
			
		||||
	Id uint32
 | 
			
		||||
	ClientConfig
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Client struct {
 | 
			
		||||
	ctx         context.Context
 | 
			
		||||
	ctx_cancel  context.CancelFunc
 | 
			
		||||
@ -66,7 +71,7 @@ type ClientPeerConn struct {
 | 
			
		||||
// client connection to server
 | 
			
		||||
type ClientConn struct {
 | 
			
		||||
	cli      *Client
 | 
			
		||||
	cfg      *ClientConfig
 | 
			
		||||
	cfg      ClientConfigActive
 | 
			
		||||
	saddr    *net.TCPAddr // server address that is connected to
 | 
			
		||||
	id       uint32
 | 
			
		||||
	lid      string
 | 
			
		||||
@ -343,7 +348,7 @@ func NewClientConn(c *Client, addr *net.TCPAddr, cfg *ClientConfig) *ClientConn
 | 
			
		||||
	cts.cli = c
 | 
			
		||||
	cts.route_map = make(ClientRouteMap)
 | 
			
		||||
	cts.saddr = addr
 | 
			
		||||
	cts.cfg = cfg
 | 
			
		||||
	cts.cfg.ClientConfig = *cfg
 | 
			
		||||
	cts.stop_req.Store(false)
 | 
			
		||||
	cts.stop_chan = make(chan bool, 8)
 | 
			
		||||
 | 
			
		||||
@ -752,6 +757,7 @@ func (c *Client) AddNewClientConn(addr *net.TCPAddr, cfg *ClientConfig) (*Client
 | 
			
		||||
		id++
 | 
			
		||||
	}
 | 
			
		||||
	cts.id = id
 | 
			
		||||
	cts.cfg.Id = id // store it again in the active configuration for easy access via control channel
 | 
			
		||||
	cts.lid = fmt.Sprintf("%d", id)
 | 
			
		||||
 | 
			
		||||
	c.cts_map[addr] = cts
 | 
			
		||||
@ -809,10 +815,7 @@ func (c *Client) RunTask(wg *sync.WaitGroup) {
 | 
			
		||||
	// StartService() calls cts.RunTask() instead.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// naming convention:
 | 
			
		||||
//   RunService - returns after having executed another go routine
 | 
			
		||||
//   RunTask - supposed to be detached as a go routine
 | 
			
		||||
func (c *Client) StartService(data interface{}) {
 | 
			
		||||
func (c *Client) start_service(data interface{}) (*ClientConn, error) {
 | 
			
		||||
	var saddr *net.TCPAddr
 | 
			
		||||
	var cts *ClientConn
 | 
			
		||||
	var err error
 | 
			
		||||
@ -821,29 +824,43 @@ func (c *Client) StartService(data interface{}) {
 | 
			
		||||
 | 
			
		||||
	cfg, ok = data.(*ClientConfig)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		fmt.Printf("invalid configuration given")
 | 
			
		||||
		return
 | 
			
		||||
		err = fmt.Errorf("invalid configuration given")
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(cfg.PeerAddrs) < 0 || len(cfg.PeerAddrs) > int(^uint16(0)) { // TODO: change this check... not really right...
 | 
			
		||||
		fmt.Printf("no peer addresses or too many peer addresses")
 | 
			
		||||
		return
 | 
			
		||||
		err = fmt.Errorf("invalid number of peer addresses given to server connection to %s", cfg.ServerAddr)
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	saddr, err = net.ResolveTCPAddr(NET_TYPE_TCP, cfg.ServerAddr) // TODO: make this interruptable...
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Printf("unable to resolve %s - %s", cfg.ServerAddr, err.Error())
 | 
			
		||||
		return
 | 
			
		||||
		err = fmt.Errorf("unresolavable address %s - %s", cfg.ServerAddr, err.Error())
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	cts, err = c.AddNewClientConn(saddr, cfg)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Printf("unable to add server connection structure to %s - %s", cfg.ServerAddr, err.Error())
 | 
			
		||||
		return
 | 
			
		||||
		err = fmt.Errorf("unable to add server connection structure to %s - %s", cfg.ServerAddr, err.Error())
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	c.wg.Add(1)
 | 
			
		||||
	go cts.RunTask(&c.wg)
 | 
			
		||||
 | 
			
		||||
	return cts, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Client) StartService(data interface{}) {
 | 
			
		||||
	var cts *ClientConn
 | 
			
		||||
	var err error
 | 
			
		||||
 | 
			
		||||
	cts, err = c.start_service(data)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		c.log.Write("", LOG_ERROR, "Failed to start service - %s", err.Error())
 | 
			
		||||
	} else {
 | 
			
		||||
		c.log.Write("", LOG_INFO, "Started service for %s [%d]", cts.cfg.ServerAddr, cts.cfg.Id)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *Client) StartExtService(svc Service, data interface{}) {
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user