func Socket(ip string, port string, name string) (s *Sock, err error) {
	s = <-socketNonBlocking(ip, port, name)
	if s == nil {
		err = fmt.Errorf("could not create socket")
	}
	return
}
create and connect a socket.
if ip == "", will listen on port until a SYN arrives
else, will send a SYN to ip:port to establish a connection
package udpDataplane
import (
	"fmt"
	"net"
	"strconv"
	"strings"
	"sync"
	"time"
	"ccp/ipc"
	"github.com/akshayknarayan/udp/packetops"
	log "github.com/sirupsen/logrus"
)
func init() {
	log.SetLevel(log.InfoLevel)
}
type Sock struct {
	name string
	port uint32
	conn        *net.UDPConn  
	writeBuf    []byte        
	writeBufPos int
	readBuf     []byte  
	cwnd           uint32
	lastAckedSeqNo uint32
	dupAckCnt      uint8
	nextSeqNo      uint32
	inFlight       *window
	lastAck   uint32
	rcvWindow *window
	ackNotifyThresh uint32
	ipc             *ipc.Ipc
	shouldTx    chan interface{}
	shouldPass  chan uint32
	notifyAcks  chan notifyAck
	notifyDrops chan notifyDrop
	ackedData   chan uint32
	closed      chan interface{}
	mux sync.Mutex
}