I've looked at the examples and tutorials and have destroyed my code trying to get this to work:

* I want to connect to a server on a shared port and get a new port number and a unique ID.
* The server should accept connections on a shared port and then open a new port to continue communication.
* This happens synchronously.

Currently, I can connect to the server:

        tcp::resolver resolver(io);
        tcp::resolver::query query(server, port);
        tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
        tcp::resolver::iterator end;
        boost::system::error_code error = boost::asio::error::host_not_found;

        while (error && endpoint_iterator != end) {
            serverSocket.close();
            serverSocket.connect(*endpoint_iterator++, error);
        }
        if (error) {
            throw boost::system::system_error(error);
        }

        int messageSize = sizeof(ident) * 2 + sizeof(int); // ID and port
        void *message = malloc(messageSize);

        boost::asio::read(serverSocket, boost::asio::buffer((char *) message, messageSize));

The server code, ripped from the example:

    tcp::endpoint endpoint( tcp::v4(), this->listenPort );
    tcp::acceptor a( io, endpoint );

    do {
        boost::shared_ptr<tcp::socket> sock(new tcp::socket( io ));
        this->listenSocket = sock;
        a.accept( *this->listenSocket );
    } while(true);

As you can see, the server does nothing with the client connection.  However, the client reads the 12 bytes as requested in the last line with boost::asio::read.  The information received here is junk (to my program) and causes it to crash.

What am I doing wrong? What should I be doing?

Any help is much appreciated!

Thanks,
Wes