abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 04:44 | Nová verze

    Nová čísla časopisů od nakladatelství Raspberry Pi: MagPi 140 (pdf) a HackSpace 77 (pdf).

    Ladislav Hagara | Komentářů: 0
    dnes 01:00 | Nová verze

    ESPHome, tj. open source systém umožňující nastavovat zařízení s čipy ESP (i dalšími) pomocí konfiguračních souborů a připojit je do domácí automatizace, například do Home Assistantu, byl vydán ve verzi 2024.4.0.

    Ladislav Hagara | Komentářů: 0
    včera 22:11 | IT novinky Ladislav Hagara | Komentářů: 0
    včera 20:55 | Nová verze

    Neziskové průmyslové konsorcium Khronos Group vydalo verzi 1.1 specifikace OpenXR (Wikipedie), tj. standardu specifikujícího přístup k platformám a zařízením pro XR, tj. platformám a zařízením pro AR (rozšířenou realitu) a VR (virtuální realitu). Do základu se z rozšíření dostalo XR_EXT_local_floor. Společnost Collabora implementuje novou verzi specifikace do platformy Monado, tj. open source implementace OpenXR.

    Ladislav Hagara | Komentářů: 2
    včera 17:22 | Nová verze

    Byla vydána nová verze 0.38.0 multimediálního přehrávače mpv (Wikipedie) vycházejícího z přehrávačů MPlayer a mplayer2. Přehled novinek, změn a oprav na GitHubu. Požadován je FFmpeg 4.4 nebo novější a také libplacebo 6.338.2 nebo novější.

    Ladislav Hagara | Komentářů: 1
    včera 17:11 | Nová verze

    ClamAV (Wikipedie), tj. multiplatformní antivirový engine s otevřeným zdrojovým kódem pro detekci trojských koní, virů, malwaru a dalších škodlivých hrozeb, byl vydán ve verzích 1.3.1, 1.2.3 a 1.0.6. Ve verzi 1.3.1 je mimo jiné řešena bezpečnostní chyba CVE-2024-20380.

    Ladislav Hagara | Komentářů: 1
    včera 12:11 | IT novinky

    Digitální a informační agentura (DIA) oznámila (PDF, X a Facebook), že mobilní aplikace Portál občana je ode dneška oficiálně venku.

    Ladislav Hagara | Komentářů: 7
    včera 05:11 | Komunita

    #HACKUJBRNO 2024, byly zveřejněny výsledky a výstupy hackathonu města Brna nad otevřenými městskými daty, který se konal 13. a 14. dubna 2024.

    Ladislav Hagara | Komentářů: 2
    17.4. 17:55 | IT novinky

    Společnost Volla Systeme stojící za telefony Volla spustila na Kickstarteru kampaň na podporu tabletu Volla Tablet s Volla OS nebo Ubuntu Touch.

    Ladislav Hagara | Komentářů: 3
    17.4. 17:44 | IT novinky

    Společnost Boston Dynamics oznámila, že humanoidní hydraulický robot HD Atlas šel do důchodu (YouTube). Nastupuje nová vylepšená elektrická varianta (YouTube).

    Ladislav Hagara | Komentářů: 1
    KDE Plasma 6
     (68%)
     (10%)
     (2%)
     (19%)
    Celkem 556 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Dotaz: Jednoduchy socket server

    12.5.2005 13:52 Elpin
    Jednoduchy socket server
    Přečteno: 282×
    Potreboval bych poradit. Mam tenhleten C++ kod:
    int main( int argn, char **arg ) 
    { 
     int port = atoi( arg[ 1 ] ); 
    
     int sock_listen = socket( AF_INET, SOCK_STREAM, 0 ); 
    
     in_addr addr_any = { INADDR_ANY }; 
     sockaddr_in srv_addr; 
     srv_addr.sin_family = AF_INET; 
     srv_addr.sin_port = htons( port ); 
     srv_addr.sin_addr = addr_any; 
    
     // set socket options to reuse address and port again in short time 
     int opt = 1; 
     setsockopt( sock_listen, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof( opt ) ); 
    
     // assign address and port to socket 
     bind( sock_listen, (const sockaddr * ) &srv_addr, sizeof( srv_addr ) ); 
    
     listen( sock_listen, 1 ); 
    
     int sock_client = 0; 
    
     // go! 
     while ( 1 ) 
     { 
         char buf[ 100 ]; 
    
         fd_set read_wait_set; 
         // set all bits to zero 
         FD_ZERO( &read_wait_set ); 
    
         // wait for stdin 
         FD_SET( STDIN_FILENO, &read_wait_set ); 
    
         // select listen or client socket 
         if ( sock_client ) 
             FD_SET( sock_client, &read_wait_set ); 
         else 
             FD_SET( sock_listen, &read_wait_set ); 
    
         // wait for selected handles 
         if ( select( MAX( sock_client, sock_listen ) + 1, 
                              &read_wait_set, 0, 0, 0 ) < 0 ) break; 
    
         // data on stdin? 
         if ( FD_ISSET( STDIN_FILENO, &read_wait_set ) ) 
         { 
             //  read data from stdin 
             int l = read( STDIN_FILENO, buf, sizeof( buf ) ); 
             if ( l < 0 ) 
                 printf( "Unable to read data from stdin." ); 
             else 
                 printf( "Got %d bytes from stdin.", l ); 
    
             // send data to client 
             l = write( sock_client, buf, l ); 
             if ( l < 0 ) 
                 printf( "Unable send data to client." ); 
             else 
                 printf( "Sent %d bytes to client.", l ); 
         } 
    
         // new connection form client? 
         else if ( FD_ISSET( sock_listen, &read_wait_set ) ) 
         { 
             sockaddr_in rsa; 
             int rsa_size = sizeof( rsa ); 
    
             // accept connection from client 
             sock_client = accept( sock_listen, ( sockaddr * ) &rsa, ( socklen_t * ) &rsa_size ); 
    
             uint lsa = sizeof( srv_addr ); 
    
             // get my identification 
             getsockname( sock_client, ( sockaddr * ) &srv_addr, &lsa ); 
          
             // get client info 
             getpeername( sock_client, ( sockaddr * ) &srv_addr, &lsa ); 
    
             printf( "Peer name: '%s'  port: %d", 
                      inet_ntoa( srv_addr.sin_addr ), ntohs( srv_addr.sin_port ) ); 
    
             printf( "Enter 'quit' to quit server." ); 
         } 
    
         // data from client? 
         else if ( FD_ISSET( sock_client, &read_wait_set ) ) 
         { 
             // read data from socket 
             int l = read( sock_client, buf, sizeof( buf ) ); 
             if ( !l ) 
             { 
                 printf( "Client close socket." ); 
                 close( sock_client ); 
                 sock_client = 0; 
                 break; 
             } 
             else if ( l < 0 ) 
                 printf( "Unable to read data from socket." ); 
             else 
                 printf( "Read %d bytes from socket.", l ); 
    
             // send all data to stdout 
             l = write( STDOUT_FILENO, buf, l ); 
    
             // check, if client ask to close connection 
             if ( !strncasecmp( buf, "close", 5 ) ) 
             { 
                printf( "Client sent 'close' request, connection closed." ); 
                printf( "Now wait for new client." ); 
                 close( sock_client ); 
                 sock_client = 0; 
             } 
         } 
    
         // quit request from server or client 
         if ( !strncasecmp( buf, "quit", 4 ) ) 
         { 
             close( sock_client ); 
             printf( "Quit request entered... exiting now...\n" ); 
             break; 
         } 
     } 
    
     close( sock_listen ); 
    
     return 0; 
    } 
    
    Je to socket server. Prijima pripojeni od klientu a vypise do konzole zpravu, kterou klient napise. Ja bych prave potreboval aby server prijimal spojeni od nekolika klientu najednou a kdyz nejaky klient neco napise, server to vypise do konzole a kdyz neco napise server, vypisou to na svou konzoli vsichni klienti. Zatim jsem jen prisel na to, ze musim vlozit radek "int pid = fork()" do kodu za funkci accept() a nechat otcovsky proces at vyrizuje pripojeni a nechat potomka at dela zbytek, ale stale se mi to nedari! Mohli byste mi poradit? Byl bych vdecny za jakoukoliv pomoc. Predem diky.

    Odpovědi

    12.5.2005 15:38 miso
    Rozbalit Rozbalit vše Re: Jednoduchy socket server
    http://www.root.cz/clanky/sokety-a-c-funkce-poll-a-zaver/
    alebo hladaj funkciu select.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.