現實生活中,總有些非正常的客戶端(即殭屍客戶端),占用伺服器的資源。只有杜絕客戶端的非活動連線才能有效地提高伺服器的效率。
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "lst_timer.h" //之前所寫的定時器標頭檔案
#define fd_limit 65535
#define max_event_number 1024
#define timeslot 5
static int pipefd[2];
static sort_timer_lst timer_lst;
static int epollfd = 0;
int setnonblocking( int fd )
void addfd( int epollfd, int fd )
void sig_handler( int sig )
void addsig( int sig )
void timer_handler()
void cb_func( client_data* user_data )
int main( int argc, char* ar** )
const char* ip = ar**[1];
int port = atoi( ar**[2] );
int ret = 0;
struct sockaddr_in address;
bzero( &address, sizeof( address ) );
address.sin_family = af_inet;
inet_pton( af_inet, ip, &address.sin_addr );
address.sin_port = htons( port );
int listenfd = socket( pf_inet, sock_stream, 0 );
assert( listenfd >= 0 );
ret = bind( listenfd, ( struct sockaddr* )&address, sizeof( address ) );
assert( ret != -1 );
ret = listen( listenfd, 5 );
assert( ret != -1 );
epoll_event events[ max_event_number ];
int epollfd = epoll_create( 5 );
assert( epollfd != -1 );
addfd( epollfd, listenfd );
ret = socketpair( pf_unix, sock_stream, 0, pipefd );
assert( ret != -1 );
setnonblocking( pipefd[1] );
addfd( epollfd, pipefd[0] );
// add all the interesting signals here
addsig( sigalrm );
addsig( sigterm );
bool stop_server = false;
client_data* users = new client_data[fd_limit];
bool timeout = false;
alarm( timeslot );
while( !stop_server )
for ( int i = 0; i < number; i++ )
else if( ( sockfd == pipefd[0] ) && ( events[i].events & epollin ) )
else if( ret == 0 )
else
case sigterm:}}
}}
else if( events[i].events & epollin )}}
else if( ret == 0 )
}else}}
else
}if( timeout )
}close( listenfd );
close( pipefd[1] );
close( pipefd[0] );
delete users;
return 0;
}
Linux網路程式設計之廣播
1.概念 前面介紹的tcp,udp都是單播方式,即一對一.而廣播是一台主機向區域網內的所有主機傳送資料。這時,同一網段的所有主機都能接收到資料。傳送廣播包的步驟大致如下 1 確定乙個傳送廣播的介面,如eth0 2 確定廣播的位址,通過ioctl函式,請求碼設定為siocgifbrdaddr得到廣播的...
Linux網路程式設計之廣播
1.概念 前面介紹的tcp,udp都是單播方式,即一對一.而廣播是一台主機向區域網內的所有主機傳送資料。這時,同一網段的所有主機都能接收到資料。傳送廣播包的步驟大致如下 1 確定乙個傳送廣播的介面,如eth0 2 確定廣播的位址,通過ioctl函式,請求碼設定為siocgifbrdaddr得到廣播的...
linux網路程式設計之Socket
一.socket socket可看作是使用者程序與核心網路協議的程式設計介面.socket可用於本機程序間的通訊,也可用於網路上不同主機間的程序通訊.下圖顯示的是各種網路協議的位址格式 1.struct socketaddr 通用位址結構 通過獲取某種socketaddr結構體的首位址,不需要知道具...