Linux網路程式設計之處理非活動連線

2021-09-19 07:43:20 字數 2299 閱讀 8309

現實生活中,總有些非正常的客戶端(即殭屍客戶端),占用伺服器的資源。只有杜絕客戶端的非活動連線才能有效地提高伺服器的效率。

#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結構體的首位址,不需要知道具...