Bug in std.socket
Unknown W. Brackets
unknown at simplemachines.org
Wed Apr 15 00:38:33 PDT 2009
Does waiting for a keypress in the client thread do you any favors?
Also, you can get some mileage by doing a select() (see SocketSet) on
the socket first. This will tell you if you need to accept(), and also
allow you to do timeouts. I'm a big fan of non-blocking sockets, you
can improve connect() this way too.
-[Unknown]
Graham St Jack wrote:
> 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