Bug in std.socket

Graham St Jack graham.stjack at internode.on.net
Tue Apr 14 14:20:38 PDT 2009


Forgive my ignorance, but can anyone tell me how to post a ticket for 
phobos?

I want to report a bug in std.socket's TcpSocket.accept() (at least it 
manifests itself there for me) introduced in D 2.0.27 and still there in 
2.0.28. The following code runs to completion in 2.026 and blocks on 
accept in later compiler versions.


import std.socket;
import std.stdio;
import core.thread;


class Server {
    private {
        InternetAddress mAddress;
        Thread          mThread;
    }

    this(InternetAddress address) {
        mAddress     = address;
        mThread      = new Thread(&run);
        mThread.name = "server".dup;
        mThread.start;
    }

    void join() {
        mThread.join;
    }

    void run() {
        try {
            writefln("server - setting up server socket");
            auto listener = new TcpSocket();
            listener.bind(mAddress);
            listener.listen(5);

            // wait for a connection
            writefln("server - waiting for a client connection");
            auto socket = listener.accept();
            writefln("server - got a client connection");

            // read some data and write it back
            writefln("server - reading data from the client");
            ubyte[100] data;
            int qty = socket.receive(data);
            writefln("server - writing the data back to the client");
            socket.send(data[0..qty]);
        }
        catch (Exception ex) {
            writefln("server - server got exception: %s", ex);
        }

        // terminate
        writefln("server - terminating");
    }
}

class Client {
    private {
        InternetAddress mAddress;
        Thread          mThread;
    }

    this(InternetAddress address) {
        mAddress = address;
        mThread = new Thread(&run);
        mThread.name = "client".dup;
        mThread.start;
    }

    void join() {
        mThread.join;
    }

    void run() {
        try {
            // connect
            writefln("client - connecting to server");
            auto socket = new TcpSocket(mAddress);
            writefln("client - connected to server");

            // send and receive some data
            writefln("client - sending data to server");
            ubyte[3] send_data;
            send_data[0] = 41;
            send_data[1] = 42;
            send_data[2] = 43;
            int qty = socket.send(send_data);
            assert(qty == send_data.length);
            writefln("client - receiving data from server");
            ubyte[100] receive_data;
            qty = socket.receive(receive_data);
            writefln("client - got %s bytes from server", qty);
        }
        catch (Exception ex) {
            writefln("client - client got exception %s", ex);
        }

        // terminate
        writefln("client - terminating");
    }
}



int main(string[] args) {
    writefln("test starting");

    try {
        InternetAddress address = new InternetAddress("localhost", 12345);
        Server server = new Server(address);
        Client client = new Client(address);
        writefln("joining with server");
        server.join;
        writefln("joining with client");
        client.join;
        writefln("finished");
    }
    catch (Exception ex) {
        writefln("unexpected exception %s", ex);
    }
    return 0;
}



More information about the Digitalmars-d mailing list