Strange socket error

Heywood Floyd soul8o8 at gmail.com
Thu Dec 23 09:06:29 PST 2010


Hi!


I see.

I think my previous answer was a bit naive—I didn't appreciate the full scope of the problem. Sorry for that, but you know, internet is fast, snap snap : )

Ok, for now I'm afraid I don't have any more to add. (An isolated example would of course help greatly!)

All I can say is, in my experience, the D sockets library _does_ behave differently on different platforms. Had a server that just died seemingly random on osx, while working fine on Linux. Turned out to be bug in D sockets. So there you go. (The bug is still there btw... *cough*)

Hm, also, I realize I'm not sure I quite understand the structure of your app, and where in this structure the bug happends. Is this bug happening when your html/5-client tries to connect to the server? Or are the threads using sockets to communicate between eachother?


BR
/heywood



Bob Cowdery Wrote:

> Hi Heywood
> 
> Thankyou for your time. Yes I agree making the call blocking does stop
> the exceptions churning. Unfortunately the application stops accepting
> data now because after the first incoming transfer from the web socket
> client it sees data on the listening socket and promptly blocks on it
> and never comes off until I make another connection. I think this is
> expected behaviour. I could spawn a thread for each connection which I
> would normally do but shouldn't need to as it's really only a few users
> and I believe that would only sidestep the real problem.
> 
> There are lots of things here that don't make sense.
> 
> 1. It works for Windows and it should work for Linux (and Mac) unless
> Windows is broken and Linux is behaving as it should.
> 2. I should only see data on the listen socket when I make a new
> connection. What I see is data on the listen socket when I send data on
> the connected socket and with non-blocking even when I don't make a
> connection or send any data at all.
> 2. The really confusing thing is if I stop my USB and DSP threads it
> stops behaving like this and sees data on the correct sockets. In other
> words it works as it does on Windows so I have to assume this is the
> correct behaviour.
> 3. I've played around with trying to figure out exactly what it is in
> the other threads that causes the behaviour. I got as far as finding
> that only the DSP thead is required so that rules out misbehaving USB.
> Very oddly there is a loop that is creating some Json data (not very
> efficiently) as it's doing a lot of string concatenation. If I comment
> out this loop or reduce its iterations the exception slow down to the
> point where I just get 2 and then they stop. This points to something
> horrible going on.
> 
> I can only hope I've done something stupid that I just happen to be
> getting away with on Windows. If it's a bug in the compiler or libraries
> I think I'm stuffed as I wouldn't know where to start.
> 
> Regards
> bob
> 
> On 23/12/2010 00:20, Heywood Floyd wrote:
> > Hi Bob!
> >
> >
> > My guess: You're listener is set to be non-blocking. That means that when you call listener.accept() it will return immediately with an SocketAcceptException, if there's no connection. And you're basically calling listener.accept() over and over again in an infinite loop.
> >
> > The following example shows it:
> >
> > import std.concurrency, std.stdio, std.conv, std.socket;
> > void main()
> > {
> > 	ushort port = 9999;
> > 	Socket listener = new TcpSocket;
> > 	assert(listener.isAlive);
> > 	listener.blocking = false;
> > 	listener.bind(new InternetAddress(port));
> > 	listener.listen(10);
> > 	writeln("Listening on port: ", port);
> > 	Socket sn;
> > 	while(true){
> > 		try
> > 		{
> > 			writeln ("Accepting");
> > 			sn = listener.accept();
> > 			writeln("Connection from ", sn.remoteAddress().toString(), " established" );
> > 			assert(sn.isAlive);
> > 			assert(listener.isAlive);
> > 			break;
> > 		}
> > 		catch(Exception e)
> > 		{
> > 			writeln("Error accepting: ", e.toString() );
> > 			if(sn)
> > 			sn.close();
> > 		}
> > 	}
> > 	writeln("end");
> > }
> >
> > Running the example will print
> >     Error accepting: std.socket.SocketAcceptException: Unable to accept socket connection: Resource temporarily unavailable
> > for ever. (Tested on Mac.) When a user connects to 127.0.0.1:9999 (by for instance opening the URL in a browser) socket.accept _does_ return a connection and the program prints "end".
> >
> > I don't know why the program doesn't do this on Windows. As far as I can tell the endless exceptions _is_ the correct behaviour, right?
> >
> > Anyway, if you comment out the the line
> >     listener.blocking = false;
> > in 'listener.d', does it work as intended then? In the example above this will cause the listener.accept()-call to actually wait until it gets a connection, and thus not spew out all the exceptions.
> >
> > BR
> > /heywood
> >
> >
> >
> >
> > Bob Cowdery Wrote:
> >
> >> Hi all,
> >>
> >> This is a long shot but I'm out of ideas. I ported an app from Windows
> >> to Linux and after many issues it is working but I'm left with a strange
> >> problem. The app basically reads data streams from a USB device,
> >> processes them and outputs real-time graphical data to a browser. There
> >> is also some control input from the browser. The interface to the
> >> browser is web sockets for which I have written a D web-socket server.
> >> Depending on how much of my application I allow to run I get a stream of
> >> these errors.
> >>
> >> Error accepting: std.socket.SocketAcceptException: Unable to accept
> >> socket connection: Resource temporarily unavailable
> >> ----------------
> >> ./DcSdr() [0x80aa2ed]
> >> ./DcSdr() [0x806f52b]
> >> ./DcSdr() [0x804f752]
> >> ./DcSdr() [0x809b422]
> >> ./DcSdr() [0x80ae77e]
> >> /lib/tls/i686/cmov/libpthread.so.0(+0x596e) [0x48496e]
> >> /lib/tls/i686/cmov/libc.so.6(clone+0x5e) [0xc5fa4e]
> >>
> >> This is the web-socket accept. I seem to fall straight through the
> >> accept call even when I am not making any connection attempt. When I do
> >> connect the stream stops and I get one of these outputs each time I send
> >> data from the browser. I should not even be near the accept at that
> >> point as the connection is made.
> >>
> >> The app appears to be unaffected and works as expected. The odd think is
> >> if I shut down part of the app these errors stop. I can't tie it down to
> >> any specific thing but I suspect threading as the number of threads is
> >> reduced by stopping parts of the app. The error also seems to indicate
> >> threads are involved. I did not get this problem on Windows.
> >>
> >> Any ideas would be much appreciated.
> >>
> >> Thanks
> >> bob
> 



More information about the Digitalmars-d-learn mailing list