eGospodarka.pl

eGospodarka.plGrupypl.comp.programming › Re: from blocking to nonblocking server
Ilość wypowiedzi w tym wątku: 4

  • 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)

strony : [ 1 ]



Szukaj w grupach

Szukaj w grupach

REKLAMA

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo:

Strona korzysta z plików cookies w celu realizacji usług i zgodnie z Polityką Prywatności. Możesz określić warunki przechowywania lub dostępu do plików cookies w Twojej przeglądarce.