⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.cc

📁 Linux下使用Select模型的两个类Client And Server
💻 CC
字号:
#include "server.h"server::server(int port = 10000){    _kill = false;    struct sockaddr_in sin;        memset( &sin, 0, sizeof( sin ) );        sin.sin_family = AF_INET;    sin.sin_addr.s_addr = INADDR_ANY;        sin.sin_port = htons(port);    _fd = socket( PF_INET, SOCK_STREAM, 0 );        int optval = 1;        setsockopt( _fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&optval, sizeof( int ) );    if( bind( _fd, (struct sockaddr *)&sin, sizeof( sin ) ) == -1 ) {        cout << "bind error" << endl;    }        // listen, queue length 8        if( listen( _fd, 8 ) == -1 ) {        cout << "listen error" << endl;        //exit( 1 );    }}server::~server(){    close(_fd);        for( vector<client *> :: iterator i = clients.begin( ); i != clients.end( ); i++ )        delete *i;        clients.clear( );    }bool server::update(bool block){    if( clients.size( ) < MAXCLIENTS ) {        fd_set fdServer;                FD_ZERO( &fdServer );        FD_SET( _fd, &fdServer );                struct timeval tv;                if( block ) {            // block for 100 ms to keep from eating up all cpu time                        tv.tv_sec = 0;            tv.tv_usec = 100000;        }        else {            tv.tv_sec = 0;            tv.tv_usec = 0;        }                if( select( _fd + 1, &fdServer, NULL, NULL, &tv ) == -1 )                    {            FD_ZERO( &fdServer );                        usleep( 100 );        }                if( FD_ISSET( _fd, &fdServer ) ) {            struct sockaddr_in adrFrom;                        int iAddrLen = sizeof( adrFrom );                        int sckClient;                        if( ( sckClient = accept( _fd, (struct sockaddr *)&adrFrom, (socklen_t *)&iAddrLen ) ) == -1 )                cout << "accept error" << endl;            else{                clients.push_back( new client( sckClient, adrFrom, 0) );                cout << "clients comes" << endl;            }        }    }    else {        // maximum connections reached                usleep( 100 );    }        // process        for( vector<client *> :: iterator i = clients.begin( ); i != clients.end( ); ) {        if( (*i)->update( ) ) {            delete *i;                        i = clients.erase( i );            cout << "clients exit" << endl;        }        else            i++;    }    return _kill;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -