国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux網(wǎng)絡(luò)編程——有限狀態(tài)機(jī)

這篇具有很好參考價(jià)值的文章主要介紹了Linux網(wǎng)絡(luò)編程——有限狀態(tài)機(jī)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在邏輯單元內(nèi)部的一種高效的編程方法:有限狀態(tài)機(jī)。

有的應(yīng)用層協(xié)議頭部包含數(shù)據(jù)包類型字段,每種類型可以映射為邏輯單元的一種執(zhí)行狀態(tài),服務(wù)器可以根據(jù)它來編寫相應(yīng)的處理邏輯,下面代碼展示的是狀態(tài)獨(dú)立的有限狀態(tài)機(jī)

STATE_MACHINE(Package_pack)
{
    PackageType_type=_pack.GetType();
    switch(_type)
    {
        case type_A:
        process_package_A(_pack);
        break;
        case type_B:
        process_package_B(_pack);
        break;
    }
}

這是一個(gè)簡單的有限狀態(tài)機(jī),只不過該狀態(tài)機(jī)的每個(gè)狀態(tài)都是相互獨(dú)立的,即狀態(tài)之間沒有相互轉(zhuǎn)移。

狀態(tài)之間的轉(zhuǎn)移是需要狀態(tài)機(jī)內(nèi)部驅(qū)動(dòng)的,這種被稱作帶狀態(tài)轉(zhuǎn)移的有限狀態(tài)機(jī)

STATE_MACHINE()
{
    State cur_State=type_A;
    while(cur_State!=type_C)
    {
        Package_pack=getNewPackage();
        switch(cur_State)
        {
            case type_A:
            process_package_state_A(_pack);
            cur_State=type_B;
            break;
            case type_B:
            process_package_state_B(_pack);
            cur_State=type_C;
            break;
        }
    }
}

該狀態(tài)機(jī)包含三種狀態(tài):type_A、type_B和type_C,其中type_A是狀態(tài)機(jī)的開始狀態(tài),type_C是狀態(tài)機(jī)的結(jié)束狀態(tài)。狀態(tài)機(jī)的當(dāng)前狀態(tài)記錄在cur_State變量中。在一趟循環(huán)過程中,狀態(tài)機(jī)先通過 getNewPackage方法獲得一個(gè)新的數(shù)據(jù)包,然后根據(jù)cur_State變量的值判斷如何處理該數(shù)據(jù)包。數(shù)據(jù)包處理完之后,狀態(tài)機(jī)通過給cur_State變量傳遞目標(biāo)狀態(tài)值來實(shí)現(xiàn)狀態(tài)轉(zhuǎn)移。那么當(dāng)狀態(tài)機(jī)進(jìn)入下一趟循環(huán)時(shí), 它將執(zhí)行新的狀態(tài)對(duì)應(yīng)的邏輯。

有限狀態(tài)機(jī)應(yīng)用實(shí)例:HTTP請(qǐng)求的讀取和分析。很多網(wǎng)絡(luò)協(xié)議,包括TCP協(xié)議和IP協(xié)議,都在其頭部中提供頭部長度字段。程序根據(jù)該字段的值就可以知道是否接收到一個(gè)完整的協(xié)議頭部但HTTP協(xié)議并未提供這樣的頭部長度字段,并且其頭部長度變化也很大,可以只有十幾字節(jié),也可以有上百字節(jié)。根據(jù)協(xié)議規(guī)定,我們判斷HTTP頭部結(jié)束的依據(jù)是遇到一個(gè)空行,該空行僅包含一對(duì)回車換行符(<CR><LF>)。如果一次讀操作沒有讀入HTTP請(qǐng)求的整個(gè)頭部,即沒有遇到空行,那么我們必須等待客戶繼續(xù)寫數(shù)據(jù)并再次讀入。 因此,我們每完成一次讀操作,就要分析新讀入的數(shù)據(jù)中是否有空行。 不過在尋找空行的過程中,我們可以同時(shí)完成對(duì)整個(gè)HTTP請(qǐng)求頭部的分析(記住,空行前面還有請(qǐng)求行和頭部域),以提高解析HTTP請(qǐng)求的效率。下面代碼使用主、從兩個(gè)有限狀態(tài)機(jī)實(shí)現(xiàn)了最簡單的HTTP 請(qǐng)求的讀取和分析。為了使表述簡潔,我們約定,直接稱HTTP請(qǐng)求的一行(包括請(qǐng)求行和頭部字段)為行。

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>

#define BUFFER_SIZE 4096/*讀緩沖區(qū)大小*/
/*主狀態(tài)機(jī)的兩種可能狀態(tài),分別表示:當(dāng)前正在分析請(qǐng)求行,當(dāng)前正在分析頭部字段*/
enum CHECK_STATE { CHECK_STATE_REQUESTLINE = 0, CHECK_STATE_HEADER, CHECK_STATE_CONTENT };
/*從狀態(tài)機(jī)的三種可能狀態(tài),即行的讀取狀態(tài),分別表示:讀取到一個(gè)完整的行、行出錯(cuò)和行數(shù)據(jù)尚且不完整*/
enum LINE_STATUS { LINE_OK = 0, LINE_BAD, LINE_OPEN };
/*服務(wù)器處理HTTP請(qǐng)求的結(jié)果:NO_REQUEST表示請(qǐng)求不完整,需要繼續(xù)讀取客戶數(shù)據(jù);GET_REQUEST表示獲得了一個(gè)完整的客戶請(qǐng)求;BAD_REQUEST表示客戶請(qǐng)求有語法錯(cuò)誤;FORBIDDEN_REQUEST表示客戶對(duì)資源沒有足夠的訪問權(quán)限;INTERNAL_ERROR表示服務(wù)器內(nèi)部錯(cuò)誤;CLOSED_CONNECTION表示客戶端已經(jīng)關(guān)閉連接了*/
enum HTTP_CODE { NO_REQUEST, GET_REQUEST, BAD_REQUEST, FORBIDDEN_REQUEST, INTERNAL_ERROR, CLOSED_CONNECTION };
/*為了簡化問題,我們沒有給客戶端發(fā)送一個(gè)完整的HTTP應(yīng)答報(bào)文,而只是根據(jù)服務(wù)器的處理結(jié)果發(fā)送如下成功或失敗信息*/
static const char* szret[] = { "I get a correct result\n", "Something wrong\n" };

/*從狀態(tài)機(jī),用于解析出一行內(nèi)容*/
LINE_STATUS parse_line( char* buffer, int& checked_index, int& read_index )
{
    char temp;
/*checked_index指向buffer(應(yīng)用程序的讀緩沖區(qū))中當(dāng)前正在分析的字節(jié),read_index指向buffer中客戶數(shù)據(jù)的尾部的下一字節(jié)。buffer中第0~checked_index字節(jié)都已分析完畢,第checked_index~(read_index-1)字節(jié)由下面的循環(huán)挨個(gè)分析*/
    for ( ; checked_index < read_index; ++checked_index )
    {
        /*獲得當(dāng)前要分析的字節(jié)*/
        temp = buffer[ checked_index ];
        /*如果當(dāng)前的字節(jié)是“\r”,即回車符,則說明可能讀取到一個(gè)完整的行*/
        if ( temp == '\r' )
        {
            /*如果“\r”字符碰巧是目前buffer中的最后一個(gè)已經(jīng)被讀入的客戶數(shù)據(jù),那么這次分析沒有讀        取到一個(gè)完整的行,返回LINE_OPEN以表示還需要繼續(xù)讀取客戶數(shù)據(jù)才能進(jìn)一步分析*/
            if ( ( checked_index + 1 ) == read_index )
            {
                return LINE_OPEN;
            }
            /*如果下一個(gè)字符是“\n”,則說明我們成功讀取到一個(gè)完整的行*/
            else if ( buffer[ checked_index + 1 ] == '\n' )
            {
                buffer[ checked_index++ ] = '\0';
                buffer[ checked_index++ ] = '\0';
                return LINE_OK;
            }
            /*否則的話,說明客戶發(fā)送的HTTP請(qǐng)求存在語法問題*/
            return LINE_BAD;
        }

        /*如果當(dāng)前的字節(jié)是“\n”,即換行符,則也說明可能讀取到一個(gè)完整的行*/
        else if( temp == '\n' )
        {
            if( ( checked_index > 1 ) &&  buffer[ checked_index - 1 ] == '\r' )
            {
                buffer[ checked_index-1 ] = '\0';
                buffer[ checked_index++ ] = '\0';
                return LINE_OK;
            }
            return LINE_BAD;
        }
    }
    /*如果所有內(nèi)容都分析完畢也沒遇到“\r”字符,則返回LINE_OPEN,表示還需要繼續(xù)讀取客戶數(shù)據(jù)才能進(jìn)一步分析*/
    return LINE_OPEN;
}

/*分析請(qǐng)求行*/
HTTP_CODE parse_requestline( char* szTemp, CHECK_STATE& checkstate )
{
    char* szURL = strpbrk( szTemp, " \t" );
    /*如果請(qǐng)求行中沒有空白字符或“\t”字符,則HTTP請(qǐng)求必有問題*/
    if ( ! szURL )
    {
        return BAD_REQUEST;
    }
    *szURL++ = '\0';

    char* szMethod = szTemp;
    if ( strcasecmp( szMethod, "GET" ) == 0 )/*僅支持GET方法*/
    {
        printf( "The request method is GET\n" );
    }
    else
    {
        return BAD_REQUEST;
    }

    szURL += strspn( szURL, " \t" );
    char* szVersion = strpbrk( szURL, " \t" );
    if ( ! szVersion )
    {
        return BAD_REQUEST;
    }
    *szVersion++ = '\0';
    szVersion += strspn( szVersion, " \t" );
    
    /*僅支持HTTP/1.1*/
    if ( strcasecmp( szVersion, "HTTP/1.1" ) != 0 )
    {
        return BAD_REQUEST;
    }
    /*檢查URL是否合法*/
    if ( strncasecmp( szURL, "http://", 7 ) == 0 )
    {
        szURL += 7;
        szURL = strchr( szURL, '/' );
    }

    if ( ! szURL || szURL[ 0 ] != '/' )
    {
        return BAD_REQUEST;
    }

    //URLDecode( szURL );
    printf( "The request URL is: %s\n", szURL );

    /*HTTP請(qǐng)求行處理完畢,狀態(tài)轉(zhuǎn)移到頭部字段的分析*/
    checkstate = CHECK_STATE_HEADER;
    return NO_REQUEST;
}

/*分析頭部字段*/
HTTP_CODE parse_headers( char* szTemp )
{
    /*遇到一個(gè)空行,說明我們得到了一個(gè)正確的HTTP請(qǐng)求*/
    if ( szTemp[ 0 ] == '\0' )
    {
        return GET_REQUEST;
    }
    else if ( strncasecmp( szTemp, "Host:", 5 ) == 0 )/*處理“HOST”頭部字段*/
    {
        szTemp += 5;
        szTemp += strspn( szTemp, " \t" );
        printf( "the request host is: %s\n", szTemp );
    }
    else/*其他頭部字段都不處理*/
    {
        printf( "I can not handle this header\n" );
    }

    return NO_REQUEST;
}
/*分析HTTP請(qǐng)求的入口函數(shù)*/
HTTP_CODE parse_content( char* buffer, int& checked_index, CHECK_STATE& checkstate, int& read_index, int& start_line )
{
    LINE_STATUS linestatus = LINE_OK;/*記錄當(dāng)前行的讀取狀態(tài)*/
    HTTP_CODE retcode = NO_REQUEST;/*記錄HTTP請(qǐng)求的處理結(jié)果*/
    /*主狀態(tài)機(jī),用于從buffer中取出所有完整的行*/
    while( ( linestatus = parse_line( buffer, checked_index, read_index ) ) == LINE_OK )
    {
        char* szTemp = buffer + start_line;/*start_line是行在buffer中的起始位置*/
        start_line = checked_index;/*記錄下一行的起始位置*/
        
        /*checkstate記錄主狀態(tài)機(jī)當(dāng)前的狀態(tài)*/
        switch ( checkstate )
        {
            case CHECK_STATE_REQUESTLINE:/*第一個(gè)狀態(tài),分析請(qǐng)求行*/
            {
                retcode = parse_requestline( szTemp, checkstate );
                if ( retcode == BAD_REQUEST )
                {
                    return BAD_REQUEST;
                }
                break;
            }
            case CHECK_STATE_HEADER:/*第二個(gè)狀態(tài),分析頭部字段*/
            {
                retcode = parse_headers( szTemp );
                if ( retcode == BAD_REQUEST )
                {
                    return BAD_REQUEST;
                }
                else if ( retcode == GET_REQUEST )
                {
                    return GET_REQUEST;
                }
                break;
            }
            default:
            {
                return INTERNAL_ERROR;
            }
        }
    }

    /*若沒有讀取到一個(gè)完整的行,則表示還需要繼續(xù)讀取客戶數(shù)據(jù)才能進(jìn)一步分析*/
    if( linestatus == LINE_OPEN )
    {
        return NO_REQUEST;
    }
    else
    {
        return BAD_REQUEST;
    }
}

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] );
    
    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 ret = bind( listenfd, ( struct sockaddr* )&address, sizeof( address ) );
    assert( ret != -1 );
    
    ret = listen( listenfd, 5 );
    assert( ret != -1 );
    
    struct sockaddr_in client_address;
    socklen_t client_addrlength = sizeof( client_address );
    int fd = accept( listenfd, ( struct sockaddr* )&client_address, &client_addrlength );
    if( fd < 0 )
    {
        printf( "errno is: %d\n", errno );
    }
    else
    {
        char buffer[ BUFFER_SIZE ];/*讀緩沖區(qū)*/
        memset( buffer, '\0', BUFFER_SIZE );
        int data_read = 0;
        int read_index = 0;/*當(dāng)前已經(jīng)讀取了多少字節(jié)的客戶數(shù)據(jù)*/
        int checked_index = 0;/*當(dāng)前已經(jīng)分析完了多少字節(jié)的客戶數(shù)據(jù)*/
        int start_line = 0;/*行在buffer中的起始位置*/
        /*設(shè)置主狀態(tài)機(jī)的初始狀態(tài)*/
        CHECK_STATE checkstate = CHECK_STATE_REQUESTLINE;
        while( 1 )/*循環(huán)讀取客戶數(shù)據(jù)并分析之*/
        {
            data_read = recv( fd, buffer + read_index, BUFFER_SIZE - read_index, 0 );
            if ( data_read == -1 )
            {
                printf( "reading failed\n" );
                break;
            }
            else if ( data_read == 0 )
            {
                printf( "remote client has closed the connection\n" );
                break;
            }
    
            read_index += data_read;
            /*分析目前已經(jīng)獲得的所有客戶數(shù)據(jù)*/
            HTTP_CODE result = parse_content( buffer, checked_index, checkstate,read_index, start_line );
            if( result == NO_REQUEST )/*尚未得到一個(gè)完整的HTTP請(qǐng)求*/
            {
                continue;
            }
            else if( result == GET_REQUEST )/*得到一個(gè)完整的、正確的HTTP請(qǐng)求*/
            {
                send( fd, szret[0], strlen( szret[0] ), 0 );
                break;
            }
            else/*其他情況表示發(fā)生錯(cuò)誤*/
            {
                send( fd, szret[1], strlen( szret[1] ), 0 );
                break;
            }
        }
        close( fd );
    }
    
    close( listenfd );
    return 0;
}

這里面有一個(gè)關(guān)于"\n","\r"的小知識(shí),建議看這篇博客:(69條消息) \r,\n與\r\n有什么區(qū)別?_阿牛哥818的博客-CSDN博客

代碼中的兩個(gè)有限狀態(tài)機(jī)分別稱為主狀態(tài)機(jī)和從狀態(tài)機(jī),這體現(xiàn)了它們之間的關(guān)系:主狀態(tài)機(jī)在內(nèi)部調(diào)用從狀態(tài)機(jī)。下面先分析從狀態(tài)機(jī),即parse_line函數(shù),它從buffer中解析出一個(gè)行。下圖描述了其可能的狀態(tài)及狀態(tài)轉(zhuǎn)移過程:

Linux網(wǎng)絡(luò)編程——有限狀態(tài)機(jī)

這個(gè)狀態(tài)機(jī)的初始狀態(tài)是LINE_OK,其原始驅(qū)動(dòng)力來自于buffer中新到達(dá)的客戶數(shù)據(jù)。在main函數(shù)中,我們循環(huán)調(diào)用recv函數(shù)往buffer中讀入客戶數(shù)據(jù)。每次成功讀取數(shù)據(jù)后,我們就調(diào)用parse_content函數(shù)來分析新讀入的數(shù)據(jù)。parse_content函數(shù)首先要做的就是調(diào)用parse_line函數(shù) 來獲取一個(gè)行?,F(xiàn)在假設(shè)服務(wù)器經(jīng)過一次recv調(diào)用之后,buffer的內(nèi)容以及部分變量的值如圖(a)所示。

parse_line函數(shù)處理后的結(jié)果如圖(b)所示,它挨個(gè)檢查圖(a)所示的buffer中checked_index到(read_index-1)之間的字節(jié),判斷是否存在行結(jié)束符,并更新checked_index的值。當(dāng)前buffer中不存在行結(jié)束符,所以parse_line返回LINE_OPEN。接下來,程序繼續(xù)調(diào)用recv以讀取更多客戶數(shù)據(jù),這次讀操作后buffer中的內(nèi)容以及部分變量的值如圖 (c)所示。然后parse_line函數(shù)就又開始處理這部分新到來的數(shù)據(jù),如圖(d)所示。這次它讀取到了一個(gè)完整的行,即“HOST:localhost\r\n”。 此時(shí),parse_line函數(shù)就可以將這行內(nèi)容遞交給parse_content函數(shù)中的主狀態(tài)機(jī)來處理了。

Linux網(wǎng)絡(luò)編程——有限狀態(tài)機(jī)

主狀態(tài)機(jī)使用checkstate變量來記錄當(dāng)前的狀態(tài)。如果當(dāng)前的狀態(tài)是CHECK_STATE_REQUESTLINE,則表示parse_line函數(shù)解析出的行是請(qǐng)求行,于是主狀態(tài)機(jī)調(diào)用parse_requestline來分析請(qǐng)求行;如果當(dāng)前的狀態(tài)是CHECK_STATE_HEADER,則表示parse_line函數(shù)解析出的是頭部字段,于是主狀態(tài)機(jī)調(diào)用parse_headers來分析頭部字段.checkstate變量的初始值是CHECK_STATE_REQUESTLINE,parse_requestline函數(shù)在成功地分析完請(qǐng)求行之后將其設(shè)置為CHECK_STATE_HEADER,從而實(shí)現(xiàn)狀態(tài)轉(zhuǎn)移。文章來源地址http://www.zghlxwxcb.cn/news/detail-465102.html

到了這里,關(guān)于Linux網(wǎng)絡(luò)編程——有限狀態(tài)機(jī)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--Timewait狀態(tài)和Nagle算法

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--Timewait狀態(tài)和Nagle算法

    ? ? ? ? 對(duì)于服務(wù)器端/客戶端,當(dāng)一端結(jié)束連接時(shí),會(huì)向另一端發(fā)送 FIN 消息;兩端的在經(jīng)過四次揮手過程后,其 Socket 不會(huì)馬上消除,而是會(huì)處于一個(gè) Time-wait 狀態(tài)的階段,此時(shí) Socket 擁有的 端口號(hào)并沒有得到釋放 ,因此 不能使用相同的端口號(hào) ; ? ? ? ? 只有先斷開連接

    2024年02月09日
    瀏覽(35)
  • Unity | 渡鴉避難所-6 | 有限狀態(tài)機(jī)控制角色行為邏輯

    Unity | 渡鴉避難所-6 | 有限狀態(tài)機(jī)控制角色行為邏輯

    有限狀態(tài)機(jī)(英語:finite-state machine,縮寫:FSM),簡稱狀態(tài)機(jī),是表示有限個(gè)狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動(dòng)作等行為的數(shù)學(xué)計(jì)算模型 在游戲開發(fā)中應(yīng)用有限狀態(tài)機(jī),能夠?qū)?fù)雜的行為邏輯分解為一組簡單的狀態(tài)和轉(zhuǎn)換規(guī)則,每個(gè)狀態(tài)都可以獨(dú)立地處理其邏輯,使代碼

    2024年01月16日
    瀏覽(21)
  • 【Linux網(wǎng)絡(luò)編程】網(wǎng)絡(luò)編程套接字二

    【Linux網(wǎng)絡(luò)編程】網(wǎng)絡(luò)編程套接字二

    喜歡的點(diǎn)贊,收藏,關(guān)注一下把! TCP和UDP在編程接口上是非常像的,前面我們說過TCP是面向連接的,UDP我們上篇博客也寫過了,我們發(fā)現(xiàn)UDP服務(wù)端客戶端寫好啟動(dòng)直接就發(fā)消息了沒有建立連接。TCP是建立連接的,注定在寫的時(shí)候肯定有寫不一樣的地方。具體怎么不一樣,我們

    2024年04月15日
    瀏覽(101)
  • Linux網(wǎng)絡(luò)編程——UDP編程

    Linux網(wǎng)絡(luò)編程——UDP編程

    1、UDP通信協(xié)議,服務(wù)器端和客戶端無需建立連接,只需要知道對(duì)方套接字的地址信息就可以發(fā)送數(shù)據(jù) 2、UDP通信流程圖: 功能:創(chuàng)建套接字并返回套接字描述符 功能:將套接字與IP地址和端口號(hào)綁定 功能:發(fā)送數(shù)據(jù) 功能:接收數(shù)據(jù) 功能:關(guān)閉套接字 1、代碼功能:兩個(gè)進(jìn)程

    2023年04月19日
    瀏覽(24)
  • 【網(wǎng)絡(luò)編程】Linux網(wǎng)絡(luò)編程基礎(chǔ)與實(shí)戰(zhàn)第三彈——網(wǎng)絡(luò)名詞術(shù)語

    數(shù)據(jù)包從源地址到目的地址所經(jīng)過的路徑,由一系列路由節(jié)點(diǎn)組成。 某個(gè)路由節(jié)點(diǎn)為數(shù)據(jù)包選擇投遞方向的選路過程。 路由器工作原理 路由器是連接因特網(wǎng)中各局域網(wǎng)、廣域網(wǎng)的設(shè)備,它會(huì)根據(jù)信道的情況自動(dòng)選擇和設(shè)定路由,以最佳路徑,按前后順序發(fā)送信號(hào)的設(shè)備。

    2024年02月08日
    瀏覽(25)
  • Linux系統(tǒng)應(yīng)用編程(五)Linux網(wǎng)絡(luò)編程(上篇)

    Linux系統(tǒng)應(yīng)用編程(五)Linux網(wǎng)絡(luò)編程(上篇)

    1.兩個(gè)網(wǎng)絡(luò)模型和常見協(xié)議 (1)OSI七層模型(物數(shù)網(wǎng)傳會(huì)表應(yīng)) 物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)話層、表示層、應(yīng)用層(自下到上) (2)TCP/IP四層模型(網(wǎng)網(wǎng)傳應(yīng)) 網(wǎng)絡(luò)接口層(鏈路層)、網(wǎng)絡(luò)層、傳輸層、應(yīng)用層 (3)常見網(wǎng)絡(luò)協(xié)議所屬層 2.字節(jié)序 (1)兩種

    2023年04月25日
    瀏覽(22)
  • Linux網(wǎng)絡(luò)編程:網(wǎng)絡(luò)基礎(chǔ)

    Linux網(wǎng)絡(luò)編程:網(wǎng)絡(luò)基礎(chǔ)

    文章目錄: 一:協(xié)議?? 二:網(wǎng)絡(luò)應(yīng)用設(shè)計(jì)模式_BS模式和CS模式 三:網(wǎng)絡(luò)分層模型(OSI七層 TCP/IP四層) 四:通信過程 五:協(xié)議格式? 1.數(shù)據(jù)包封裝 2.以太網(wǎng)幀格式和ARP數(shù)據(jù)報(bào)格式? 3.IP段格式? 4.UDP數(shù)據(jù)報(bào)格式 5.TCP數(shù)據(jù)報(bào)格式 六:TCP協(xié)議 1.TCP通信時(shí)序(面向連接的可靠數(shù)據(jù)通

    2024年02月12日
    瀏覽(23)
  • 【Linux網(wǎng)絡(luò)編程】網(wǎng)絡(luò)編程套接字(TCP服務(wù)器)

    【Linux網(wǎng)絡(luò)編程】網(wǎng)絡(luò)編程套接字(TCP服務(wù)器)

    作者:愛寫代碼的剛子 時(shí)間:2024.4.4 前言:本篇博客主要介紹TCP及其服務(wù)器編碼 只介紹基于IPv4的socket網(wǎng)絡(luò)編程,sockaddr_in中的成員struct in_addr sin_addr表示32位 的IP地址 但是我們通常用點(diǎn)分十進(jìn)制的字符串表示IP地址,以下函數(shù)可以在字符串表示和in_addr表示之間轉(zhuǎn)換 字符串轉(zhuǎn)in

    2024年04月14日
    瀏覽(108)
  • Linux網(wǎng)絡(luò)編程 網(wǎng)絡(luò)基礎(chǔ)知識(shí)

    Linux網(wǎng)絡(luò)編程 網(wǎng)絡(luò)基礎(chǔ)知識(shí)

    目錄 1.網(wǎng)絡(luò)的歷史和協(xié)議的分成 2.網(wǎng)絡(luò)互聯(lián)促成了TCP/IP協(xié)議的產(chǎn)生 3.網(wǎng)絡(luò)的體系結(jié)構(gòu) 4.TCP/IP協(xié)議族體系 5.網(wǎng)絡(luò)各層的協(xié)議解釋 6.網(wǎng)絡(luò)的封包和拆包 7.網(wǎng)絡(luò)預(yù)備知識(shí)? ? ? Internet-\\\"冷戰(zhàn)\\\"的產(chǎn)物 1957年十月和十一月,前蘇聯(lián)先后歐兩顆”Spuinik”衛(wèi)星上天 1958年美國總統(tǒng)艾森豪威爾向

    2024年02月10日
    瀏覽(26)
  • 【Linux網(wǎng)絡(luò)編程】網(wǎng)絡(luò)基礎(chǔ)一

    【Linux網(wǎng)絡(luò)編程】網(wǎng)絡(luò)基礎(chǔ)一

    從今天開始我們將要從系統(tǒng)橫跨到網(wǎng)絡(luò)的學(xué)習(xí)了,因此有些書我們就可以讀起來了。 操作系統(tǒng) 原理: 《操作系統(tǒng)精髓與設(shè)計(jì)原理》、《現(xiàn)代操作系統(tǒng)》 Linux原理方面的書 : 《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》–陳莉君、《深入理解Linux內(nèi)核》(選讀–不作為重點(diǎn)) Linux編程方面的書: 《

    2024年04月15日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包