///Send data to the address specified. Returns the number of bytes sent.
  int UDPSocket::SendTo( const NetAddress &remote, const IProtocol *protocol ) throw ( Error )
  {
    ///Clear out the stream for data to be sent.
    sstream.Clear();
    //Use the protocol to format the pack about to be sent.
    int size = protocol->FormatPacket(sstream);
    int ret = sendto(socket, sstream.GetBuffer(), size, 0, remote, remote.Size());
    if (ret == SOCKET_ERROR) {
      if ( !blocking && WSAGetLastError() == WSAEWOULDBLOCK )
        return ret; // would have blocked

      ///Something really went wrong.
      ThrowError(Error::E_SocketError);
    }

    return ret;
  }
  ///Receive Data on the socket. Stores the address of the sender in address.
  ///Returns a list of the messages extracted from the buffer. Users must delete list.
  int UDPSocket::RecvFrom( NetAddress &remote ) throw ( Error )
  {
    ///Clear out the stream for data to be sent.
    rstream.Clear();
    int size = remote.Size();
    int ret = recvfrom(socket, rstream.GetBuffer(), rstream.Capacity(), 0, remote, &size);
    if (ret == SOCKET_ERROR) {
      if ( !blocking && WSAGetLastError() == WSAEWOULDBLOCK )
        return 0; // would have blocked

      ///Something really went wrong.
      ThrowError(Error::E_SocketError);
    }

    //rstream.SetWriteIndex(ret);

    ///Return the number of bytes received.
    return ret;
  }