Socket.receive not popping after socket is closed

Jonathan Marler johnnymarler at gmail.com
Mon Apr 7 13:55:30 PDT 2014


On Monday, 7 April 2014 at 19:47:07 UTC, Jonathan Marler wrote:
> I ran into a situation where I have a shared UDP socket across 
> 2 threads.  One thread is blocking on the receive call, and the 
> other does some work and then closes the socket.  The problem 
> is that the receive call is not popping after the socket is 
> closed.  I'm fairly certain this is unexpected/incorrect 
> behavior.  I've included a small program to demonstrate this:
>
> import std.stdio;
> import std.socket;
> import std.concurrency;
>
> import core.thread;
>
> __gshared Socket socket;
>
> void receiveDumper()
> {
>   ubyte[512] receiveBuffer;
>   while(true) {
>     writeln("[worker] socket.receive(...)"); stdout.flush();
>     auto read = socket.receive(receiveBuffer);
>     if(read <= 0) {
>       if(read < 0) {
>         writefln("[worker] socket.receive failed (error=%s 
> '%s')",
> 	      lastSocketError, socket.getErrorText());
>       } else {
>         writefln("[worker] Socket closed, stopping thread");
>       }
>       break;
>     }
>     writefln("[worker] Got packet");
>     stdout.flush();
>   }
>
>   writeln("[worker] done"); stdout.flush();
> }
> void main(string[] args) {
>   Address addr = new InternetAddress(InternetAddress.ADDR_ANY, 
> 12345);
>
>   socket = new Socket(addr.addressFamily, SocketType.DGRAM, 
> ProtocolType.UDP);
>   socket.bind(addr);
>
>   auto udpListenThread = spawn(&receiveDumper);
>   scope(exit) {
>     writeln("[main] scope(exit): closing socket..."); 
> stdout.flush();
>     socket.close();
>     writeln("[main] scope(exit): done closing socket"); 
> stdout.flush();
>   }
>
>   Thread.sleep(dur!("seconds")(1)); // Sleep for a second to 
> let the other thread call receive before
>                                     // the socket is closed
>
>   writeln("[main] done");
> }

Nevermind, it looks calling the "shutdown" method did the trick.


More information about the Digitalmars-d mailing list