Discussion:
(sockets) from blocking to nonblocking server
(too old to reply)
fir
2017-12-05 16:34:11 UTC
Permalink
his is offtopic but maybe someone here will/would know

i dont like to read a weeks on tcp and sockets as this is a lot and confusing
(i prefer this time to spend on c/graphics etc)

i got some old tcp-server (on winapi winsock2) code, that worked but it was
not tested/inspected for being ok and was yet only working in blocking mode

the code goes

int SetupBlockingWinsockServer()
{

WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);

/// Creating socket

servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

SOCKADDR_IN sin;
sin.sin_family = PF_INET;
sin.sin_port = htons(1111);
sin.sin_addr.s_addr = INADDR_ANY;

//bind

int retVal = bind(servSock, (LPSOCKADDR)&sin, sizeof(sin));

/// Trying to listen socket

retVal = listen(servSock, 10);

// Waiting for a client

ServClientSock = accept(servSock, NULL, NULL); return 1;


}

(i skipped the few lines of retvalue checking for errors for clarity)

my goal is just to turn it to non blocking without a lot of work but i would like to know this is ok

i checked experimentally via message boxes that it "blocks" on accept call
(block may be euphemism a bit here as it hang real hard, when no client is run then not only hourglass-pointer is shown, not only app gets fully unresponsible and non redraws itself but even closing it form task manager is hard, its possible but takes few seconds to kill)

what i did :

i added some line thet is supposed to set socked as nonblocked and move accept to separate function which i call then periodically (from run frame event)

int SetupBlockingWinsockServer()
{

WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);

/// Creating socket

servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

SOCKADDR_IN sin;
sin.sin_family = PF_INET;
sin.sin_port = htons(1111);
sin.sin_addr.s_addr = INADDR_ANY;

//bind

int retVal = bind(servSock, (LPSOCKADDR)&sin, sizeof(sin));

/// Trying to listen socket

retVal = listen(servSock, 10);

// set no blocking

u_long no_block=1;
ioctlsocket(servSock,FIONBIO,&no_block);

}

int WaitForClientAccept()
{
/// Waiting for a client

ServClientSock = accept(servSock, NULL, NULL);

if(ServClientSock == INVALID_SOCKET) return 0;


u_long no_block=1;
ioctlsocket(ServClientSock,FIONBIO,&no_block);
return 1;

}

this last one is as i said run periodically on server app frame and when it return 1 (it means it gett accepted connection?) i flag out both server code to not call it more and
client not to send more connections

it seem to work but as this is my
own slight experimentation only i would like to get pproval/confirmation
that this is in fact ok

is this ok or is there something wrong with it?

(btw as a side questions, do i need those flaging out here, or if i connected i could not bother for flaging out more sendings for connections and checks for incomming connections? (i know it would be wastefull maybe to send it still 50 times a second after connection was accepted but besides this waste would it work? (if that would be work maybe sending it once a second would work as
automatic connection reboval when something would get disconnected?)

tnx for answer if someone know whats goin on in that sockets/winsock, i got not much time for that

(fir)
Les Cargill
2017-12-06 00:39:08 UTC
Permalink
Post by fir
his is offtopic but maybe someone here will/would know
<snip>
Post by fir
tnx for answer if someone know whats goin on in that sockets/winsock, i got not much time for that
So google for "winsock non blocking example". It has to be faster than
Usenet :)
Post by fir
(fir)
--
Les Cargill
fir
2017-12-06 09:17:47 UTC
Permalink
Post by Les Cargill
Post by fir
his is offtopic but maybe someone here will/would know
<snip>
Post by fir
tnx for answer if someone know whats goin on in that sockets/winsock, i got not much time for that
So google for "winsock non blocking example". It has to be faster than
Usenet :)
Post by fir
(fir)
not really, now im searching on how to make non-blocking connect on the client.. seen about 20-30 webpages
and still no code for that

Loading...