-
1. Data: 2017-12-05 23:46:44
Temat: Re: from blocking to nonblocking server
Od: fir <p...@g...com>
W dniu wtorek, 5 grudnia 2017 17:32:33 UTC+1 użytkownik fir napisał:
> 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)
moge dodac ze to chyba dziala ok
- za to przelaczenie connecta w
kliencie na nie-blokujacy chyba nie da sie tak prosto zrobic a nie
moge nigdzie w google znalezc gotowego kodu jak to zrobic
(a czytac o tym kilka/nascie/dziesiat godzin nie mam jakos checi bo to straszne
smieci)
-
2. Data: 2017-12-08 09:30:30
Temat: Re: from blocking to nonblocking server
Od: Roman Tyczka <n...@b...no>
On Tue, 5 Dec 2017 14:46:44 -0800 (PST), fir wrote:
> W dniu wtorek, 5 grudnia 2017 17:32:33 UTC+1 użytkownik fir napisał:
> moge dodac ze to chyba dziala ok
> - za to przelaczenie connecta w
> kliencie na nie-blokujacy chyba nie da sie tak prosto zrobic a nie
> moge nigdzie w google znalezc gotowego kodu jak to zrobic
> (a czytac o tym kilka/nascie/dziesiat godzin nie mam jakos checi bo to straszne
> smieci)
Czemu po prostu nie użyjesz jakieś open sourcowej biblioteki, która to
załatwi od strzału? Zwłaszcza jeśli czujesz się cienki w socketach i tcp.
--
pozdrawiam
Roman Tyczka
-
3. Data: 2017-12-08 17:58:35
Temat: Re: from blocking to nonblocking server
Od: fir <p...@g...com>
W dniu piątek, 8 grudnia 2017 09:30:30 UTC+1 użytkownik Roman Tyczka napisał:
> On Tue, 5 Dec 2017 14:46:44 -0800 (PST), fir wrote:
>
> > W dniu wtorek, 5 grudnia 2017 17:32:33 UTC+1 użytkownik fir napisał:
> > moge dodac ze to chyba dziala ok
> > - za to przelaczenie connecta w
> > kliencie na nie-blokujacy chyba nie da sie tak prosto zrobic a nie
> > moge nigdzie w google znalezc gotowego kodu jak to zrobic
> > (a czytac o tym kilka/nascie/dziesiat godzin nie mam jakos checi bo to straszne
> > smieci)
>
> Czemu po prostu nie użyjesz jakieś open sourcowej biblioteki, która to
> załatwi od strzału? Zwłaszcza jeśli czujesz się cienki w socketach i tcp.
>
nie lubie dependencji, nie czuje sie cienki w socketach tylko nie mam znimi
doswiadczenia (tak jak wczesniej np z formatem PE),
posiedzialem 3 dni i teraz czuje w zasadzie sockety mam
mw tak samo opanowane jak uzywanie fopen/fclose/(fwrtie/fgetc etc)
osiagnalem socketowe zen i jestem zadowolony
(troche oczywisccie jeszze mozna by doczytac ale ogolnei dziala.. problem byl raczej
z tymz e tutoriale sa zle napisne a same to api jest tez co nieco brzydkie)
-
4. Data: 2017-12-08 18:13:20
Temat: Re: from blocking to nonblocking server
Od: fir <p...@g...com>
W dniu piątek, 8 grudnia 2017 17:58:37 UTC+1 użytkownik fir napisał:
> W dniu piątek, 8 grudnia 2017 09:30:30 UTC+1 użytkownik Roman Tyczka napisał:
> > On Tue, 5 Dec 2017 14:46:44 -0800 (PST), fir wrote:
> >
> > > W dniu wtorek, 5 grudnia 2017 17:32:33 UTC+1 użytkownik fir napisał:
> > > moge dodac ze to chyba dziala ok
> > > - za to przelaczenie connecta w
> > > kliencie na nie-blokujacy chyba nie da sie tak prosto zrobic a nie
> > > moge nigdzie w google znalezc gotowego kodu jak to zrobic
> > > (a czytac o tym kilka/nascie/dziesiat godzin nie mam jakos checi bo to straszne
> > > smieci)
> >
> > Czemu po prostu nie użyjesz jakieś open sourcowej biblioteki, która to
> > załatwi od strzału? Zwłaszcza jeśli czujesz się cienki w socketach i tcp.
> >
> nie lubie dependencji, nie czuje sie cienki w socketach tylko nie mam znimi
doswiadczenia (tak jak wczesniej np z formatem PE),
> posiedzialem 3 dni i teraz czuje w zasadzie sockety mam
> mw tak samo opanowane jak uzywanie fopen/fclose/(fwrtie/fgetc etc)
>
> osiagnalem socketowe zen i jestem zadowolony
>
> (troche oczywisccie jeszze mozna by doczytac ale ogolnei dziala.. problem byl
raczej z tymz e tutoriale sa zle napisne a same to api jest tez co nieco brzydkie)
nawiasdem mowiac ten kawalek
do 'nieblokujacego' (troche wyglada raczej jak blokujacy tylko z ustawialnym
timeoutem)
znalezniony w necie
int WaitForServerConnectionUnblocked()
{
u_long no_block=1;
ioctlsocket(clientSock,FIONBIO,&no_block);
//connect to the server
// iResult = connect(client, (sockaddr*)&server, sizeof(server));
int retVal = connect(clientSock,(LPSOCKADDR)&serverInfo, sizeof(serverInfo));
if( retVal == SOCKET_ERROR)
{
int iError = WSAGetLastError();
//check if error was WSAEWOULDBLOCK, where we'll wait
if(iError == WSAEWOULDBLOCK)
{
/// cout << "Attempting to connect.\n";
fd_set Write, Err;
TIMEVAL Timeout;
FD_ZERO(&Write);
FD_ZERO(&Err);
FD_SET(clientSock, &Write);
FD_SET(clientSock, &Err);
Timeout.tv_sec = 0;
Timeout.tv_usec = 30*1000;
int iResult = select(0, NULL, &Write, &Err, &Timeout);
if(iResult == 0)
{
// cout << "Connect Timeout (" << TimeoutSec << " Sec).\n";
return 0;
}
else
{
if(FD_ISSET(clientSock, &Write))
{
// cout << "Connected!\n";
return 1;
}
if(FD_ISSET(clientSock, &Err))
{
// cout << "Select error.\n";
return 0;
}
}
}
else
{
// cout << "Failed to connect to server.\n";
// cout << "Error: " << WSAGetLastError() << endl;
// WSACleanup();
return 0;
}
}
else
{
//connected without waiting (will never execute)
//cout << "Connected!\n";
return 1;
}
}
co dziwne lokalnie to dziala acz od czasu do czasu nie zawiazuje polaczenia - zdalnie
nie chcialo dzilac
jeszcze tego nie testowalem ale byc moze ten timeout tutaj ustawiony (30 ms) jest za
maly
to wogole chyba nie tak powinno wygladac, wydaje mi sie ze nalezy chyba zarzucic
connect
(ktory ma byc nieblokujacy a pozniej sprawdzac czy przyszlo info ze 'zaszedl' (jest
connected) - jesli tak to dzial to chyab powinienem to podzielic na dwie funkcje ale
musze jeszcze troche doczytac by uzupelnic zen ;c (nie wszystko na raz, ogolneie
jednak czuje sie z scketami jestem juz ok ;c)