• 大小:
    文件类型: .7z
    金币: 2
    下载: 5 次
    发布日期: 2023-07-27
  • 语言: 其他
  • 标签: linux  code  pdf  

资源简介

Linux高性能服务器编程(高清PDF)+项目源码(完整)

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define MAX_EVENT_NUMBER 1024
static int pipefd[2];

int setnonblocking( int fd )
{
    int old_option = fcntl( fd F_GETFL );
    int new_option = old_option | O_NONBLOCK;
    fcntl( fd F_SETFL new_option );
    return old_option;
}

void addfd( int epollfd int fd )
{
    epoll_event event;
    event.data.fd = fd;
    event.events = EPOLLIN | EPOLLET;
    epoll_ctl( epollfd EPOLL_CTL_ADD fd &event );
    setnonblocking( fd );
}

void sig_handler( int sig )
{
    int save_errno = errno;
    int msg = sig;
    send( pipefd[1] ( char* )&msg 1 0 );
    errno = save_errno;
}

void addsig( int sig )
{
    struct sigaction sa;
    memset( &sa ‘\0‘ sizeof( sa ) );
    sa.sa_handler = sig_handler;
    sa.sa_flags |= SA_RESTART;
    sigfillset( &sa.sa_mask );
    assert( sigaction( sig &sa NULL ) != -1 );
}

int main( int argc char* argv[] )
{
    if( argc <= 2 )
    {
        printf( “usage: %s ip_address port_number\n“ basename( argv[0] ) );
        return 1;
    }
    const char* ip = argv[1];
    int port = atoi( argv[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 );

    //int nReuseAddr = 1;
    //setsockopt( listenfd SOL_SOCKET SO_REUSEADDR &nReuseAddr sizeof( nReuseAddr ) );
    ret = bind( listenfd ( struct sockaddr* )&address sizeof( address ) );
    if( ret == -1 )
    {
        printf( “errno is %d\n“ errno );
        return 1;
    }
    //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( SIGHUP );
    addsig( SIGCHLD );
    addsig( SIGTERM );
    addsig( SIGINT );
    bool stop_server = false;

    while( !stop_server )
    {
        int number = epoll_wait( epollfd events MAX_EVENT_NUMBER -1 );
        if ( ( number < 0 ) && ( errno != EINTR ) )
        {
            printf( “epoll failure\n“ );
            break;
        }
    
        for ( int i = 0; i < number; i++ )
        {
            int sockfd = events[i].data.fd;
            if( sockfd == listenfd )
            {
                struct sockaddr_in client_address;
                socklen_t client_addrlength = sizeof( client_address );
            

评论

共有 条评论