📄 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 + -