strange problem with socket.accept()

Regan Heath regan at netmail.co.nz
Wed May 30 06:33:01 PDT 2007


Charma Wrote:
> Paul Findlay Wrote:
> 
> > > while(!killServer)
> > > {
> > > writef( "Waiting for user..." ); // **
> > > user = server.accept( );
> > > writef("[OK]")
> > > ...
> > > }
> > 
> > > Now my problem is that the line marked with ** is only displayed when a
> > > user connects... which is very strange... i can't figure out the problem,
> > > since i tell him to FIRST write that line and THEN wait for a user...
> > > Any ideas?
> > Output buffering? Since server.accept() blocks you have to wait for the user
> > to connect until writef next called, whereupon the buffered output may be
> > flushed?
> > 
> > Maybe try something like the following instead
> > 
> > import std.c.stdio;
> > 
> > // ...
> > while(/*...*/)
> > {
> >     writef( "Waiting for user..." );
> >     fflush(stdout); // or flushall();
> >     // ...
> > }
> > 
> > Yes, I am just guessing. Perhaps best to ask in digitalmars.D.learn
> > 
> >  - Paul
> 
> 
> i do know that accept blocks... but it is called AFTER the writef... so it should black AFTER it... i still don't get it...

I am fairly sure it is output buffering (as Paul suggested).  Change writef to writefln (I believe the output code flushes itself when a newline is sent).  Failing that manually flushing as Paul mentioned should fix it.

To explain, you call writef, it puts that in the output buffer but does not flush that to the screen.  You call accept, this waits for a connection, a connection arrives and (for some reason) the output buffer gets flushed, perhaps because the socket code flushes all handles at some stage?

Regan



More information about the Digitalmars-d mailing list