public Remote Receive()
        {
            WinSock.sockaddr_in recvaddr = new WinSock.sockaddr_in();
            int addrlen = WinSock.sockaddr_in.Size;

            var len = WinSock.recvfrom(_Socket, Buffer.Pointer, Buffer.Capacity, 0,
                ref recvaddr, ref addrlen);
            if (len >= 0)
            {
                var ret = FindRemote(ref recvaddr);
                if (ret == null)
                {
                    //block
                    return null;
                }
                Buffer.Reset(len);
                ret.ReceiveCount += 1;
                return ret;
            }
            var e = Marshal.GetLastWin32Error();
            if (e == 10035)
            {
                return null;
            }
            throw new NetworkException(e);
        }
        public void Bind(int port)
        {
            WinSock.sockaddr_in addr = new WinSock.sockaddr_in();
            addr.sin_family = WinSock.AF_INET;
            addr.sin_port = WinSock.htons((ushort)port);
            addr.sin_addr = 0; //any

            WinSock.bind(_Socket, ref addr, WinSock.sockaddr_in.Size);
        }
 public Remote(ref WinSock.sockaddr_in addr, long time)
 {
     Address = addr;
     LastSend = time;
     LastReceived = time;
 }
        public Remote Send(string ip, int port)
        {
            WinSock.sockaddr_in addr = new WinSock.sockaddr_in();
            addr.sin_family = WinSock.AF_INET;
            addr.sin_port = WinSock.htons((ushort)port);
            addr.sin_addr = WinSock.inet_addr(ip);
            var remote = FindRemote(ref addr);

            if (remote == null)
            {
                return null;
            }

            Send(remote);
            return remote;
        }