Thread: RE: [INTERFACES] Win32 interface

RE: [INTERFACES] Win32 interface

From
Magnus Hagander
Date:
> >> ISTM there was some reason it wouldn't work, like maybe you can
> >> only call WSAStartup once per program, but I don't recall for sure.
> 
> > We can call WSAStartup() more than once. However,there must be a
> > call to WSACleanup() for every successful call to WSAStartup()
> > made by a task. Only the final WSACleanup() for that task does the
> > actual cleanup.
> >
> > The simplest way may be to call WSAStartup() while connecting and 
> > to call WSACleanup() while finishing(including error cases).
> 
> That would be an easy change.  Are these functions fast enough that
> calling them for every connect/disconnect cycle would be tolerable?

I beleive so. But we could probably get away from that using static
variables, no? Somewhere just put:

static int has_wsastartup = 0;

...

if (!has_wsastartup) {  has_wsastartup = 1;  WSAStartup()...
}


That way, it would only be run once, right? 
Naturally, everything within #ifdef WIN32.


One could also check the result code from the first winsock call. If that
one is 'Winsock not initialized', then initialize it and try again. This
would get us around the case of the client application calling WSAStartup()
on its own. But that is probably not necessary - that applcation will call
WSACleanup itself, and an app is allowed to call WSAStartup() more than
once.

Mvh,Magnus


RE: [INTERFACES] Win32 interface

From
"Hiroshi Inoue"
Date:
> 
> > >> ISTM there was some reason it wouldn't work, like maybe you can
> > >> only call WSAStartup once per program, but I don't recall for sure.
> > 
> > > We can call WSAStartup() more than once. However,there must be a
> > > call to WSACleanup() for every successful call to WSAStartup()
> > > made by a task. Only the final WSACleanup() for that task does the
> > > actual cleanup.
> > >
> > > The simplest way may be to call WSAStartup() while connecting and 
> > > to call WSACleanup() while finishing(including error cases).
> > 
> > That would be an easy change.  Are these functions fast enough that
> > calling them for every connect/disconnect cycle would be tolerable?
> 
> I beleive so. But we could probably get away from that using static
> variables, no? Somewhere just put:
> 
> static int has_wsastartup = 0;
> 
> ...
> 
> if (!has_wsastartup) {
>    has_wsastartup = 1;
>    WSAStartup()...
> }
> 
> 
> That way, it would only be run once, right? 
> Naturally, everything within #ifdef WIN32.
>

I don't object to your solution.

WSACleanup() is never called.
But no one would care about such a thing.

Regards.

Hiroshi Inoue
Inoue@tpf.co.jp