func (c *candidateBase) start(a *Agent, conn net.PacketConn) {
	c.currAgent = a
	c.conn = conn
	c.closeCh = make(chan struct{})
	c.closedCh = make(chan struct{})
	go c.recvLoop()
}
start runs the candidate using the provided connection
package ice
import (
	"fmt"
	"net"
	"sync/atomic"
	"time"
	"github.com/pion/logging"
	"github.com/pion/stun"
)
type candidateBase struct {
	id            string
	networkType   NetworkType
	candidateType CandidateType
	component      uint16
	address        string
	port           int
	relatedAddress *CandidateRelatedAddress
	resolvedAddr *net.UDPAddr
	lastSent     atomic.Value
	lastReceived atomic.Value
	conn         net.PacketConn
	currAgent *Agent
	closeCh   chan struct{}
	closedCh  chan struct{}
}
func (c *candidateBase) ID() string {
	return c.id
}
func (c *candidateBase) Address() string {
	return c.address
}
func (c *candidateBase) Port() int {
	return c.port
}
func (c *candidateBase) Type() CandidateType {
	return c.candidateType
}
func (c *candidateBase) NetworkType() NetworkType {
	return c.networkType
}
func (c *candidateBase) Component() uint16 {
	return c.component
}
func (c *candidateBase) LocalPreference() uint16 {
	return defaultLocalPreference
}
func (c *candidateBase) RelatedAddress() *CandidateRelatedAddress {
	return c.relatedAddress
}