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

《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于TCP的服務(wù)器端/客戶端

這篇具有很好參考價(jià)值的文章主要介紹了《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于TCP的服務(wù)器端/客戶端。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

1--TCP/IP協(xié)議棧

2--TCP服務(wù)器端默認(rèn)函數(shù)調(diào)用順序

3--TCP客戶端的默認(rèn)函數(shù)調(diào)用順序

4--Linux實(shí)現(xiàn)迭代回聲服務(wù)器端/客戶端

5--Windows實(shí)現(xiàn)迭代回聲服務(wù)器端/客戶端

6--TCP原理

7--Windows實(shí)現(xiàn)計(jì)算器服務(wù)器端/客戶端


1--TCP/IP協(xié)議棧

????????TCP/IP協(xié)議棧共分 4 層,可以理解為數(shù)據(jù)收發(fā)分成了 4 個(gè)層次化過(guò)程;

《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于TCP的服務(wù)器端/客戶端,網(wǎng)絡(luò)編程筆記,tcp/ip

鏈路層:

? ? ? ? 鏈路層是物理鏈接領(lǐng)域標(biāo)準(zhǔn)化的結(jié)果,專門定義LAN、WAN、MAN等網(wǎng)絡(luò)標(biāo)準(zhǔn);

IP層:

? ? ? ? IP層用于解決數(shù)據(jù)傳輸過(guò)程中路徑的選擇問(wèn)題;

TCP/IP層:

????????即傳輸層,用于解決數(shù)據(jù)傳輸?shù)膯?wèn)題(數(shù)據(jù)順序、可靠性等);

應(yīng)用層:

????????程序員根據(jù)數(shù)據(jù)傳輸規(guī)則,編寫規(guī)定的程序(例如Socket)來(lái)實(shí)現(xiàn)數(shù)據(jù)傳輸;

2--TCP服務(wù)器端默認(rèn)函數(shù)調(diào)用順序

? ? ? ? 一般 TCP 服務(wù)器端調(diào)用默認(rèn)函數(shù)的順序如下:socket() 創(chuàng)建 Socket?→ bind() 分配Socket 地址 → listen() 等待連接請(qǐng)求狀態(tài) → accept() 允許連接 → read()/write() 數(shù)據(jù)交換 → close() 斷開(kāi)連接;

? ? ? ? 調(diào)用 listen() 函數(shù)進(jìn)入等待連接請(qǐng)求狀態(tài),只有服務(wù)器端調(diào)用了 listen() 函數(shù),客戶端才能進(jìn)入可發(fā)出連接請(qǐng)求的狀態(tài);

#include <sys/socket.h>

int listen(int sock, int backlog); // 成功時(shí)返回 0, 失敗時(shí)返回 -1;

// sock 表示希望進(jìn)入等待連接請(qǐng)求狀態(tài)的Socket的文件描述符
// backlog 表示連接請(qǐng)求等待隊(duì)列的長(zhǎng)度,即最多可以使多少個(gè)連接請(qǐng)求進(jìn)入隊(duì)列

? ? ? ? 服務(wù)器端調(diào)用 accept() 函數(shù)來(lái)受理客戶端的連接請(qǐng)求,即受理等待隊(duì)列中待處理的客戶端連接請(qǐng)求;

#include <sys/socket.h>

int accept(int sock, struct sockaddr* addr, socklen_t* addrlen);
// 成功時(shí)返回創(chuàng)建的Socket的文件描述符,失敗時(shí)返回-1

3--TCP客戶端的默認(rèn)函數(shù)調(diào)用順序

? ? ? ? 一般 TCP 客戶端調(diào)用默認(rèn)函數(shù)的順序如下:socket() 創(chuàng)建 Socket?→ connect() 請(qǐng)求連接 → read()/write() 交換數(shù)據(jù) → close() 斷開(kāi)連接;

? ? ? ? 在服務(wù)器端調(diào)用 listen() 函數(shù)創(chuàng)建連接請(qǐng)求等待隊(duì)列后,客戶端可通過(guò)調(diào)用 connect() 函數(shù)來(lái)請(qǐng)求連接;

#include <sys/socket.h>

int connect(int sock, struct sockaddr* servaddr, socklen_t addrlen);

// sock 表示客戶端socket的文件描述符
// servaddr 保存了目標(biāo)服務(wù)器端地址信息
// addrlen 第二個(gè)結(jié)構(gòu)體參數(shù) servaddr 的地址變量長(zhǎng)度,以字節(jié)為單位

4--Linux實(shí)現(xiàn)迭代回聲服務(wù)器端/客戶端

服務(wù)器端:

// gcc echo_server.c -o echo_server
// ./echo_server 9190

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 1024
void error_handling(char *message){
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

int main(int argc, char *argv[]){
    int serv_sock, clnt_sock;
    char message[BUF_SIZE];
    int str_len, i;

    struct sockaddr_in serv_adr, clnt_adr;
    socklen_t clnt_adr_sz;

    if(argc != 2){
        printf("Usage : %s <port>\n", argv[0]);
        exit(1);
    }

    serv_sock = socket(PF_INET, SOCK_STREAM, 0);
    if(serv_sock == -1){
        error_handling("socket() error");
    }

    memset(&serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_adr.sin_port = htons(atoi(argv[1]));

    if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr)) == -1){
        error_handling("bind() error");
    }

    if(listen(serv_sock, 5) == -1){
        error_handling("listen() error");
    }

    clnt_adr_sz = sizeof(clnt_adr);

    for(i = 0; i < 5; i++){
        clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);
        if(clnt_sock == -1){
            error_handling("accept() error");
        }
        else{
            printf("Connected client %d \n", i+1);
        }

        while((str_len = read(clnt_sock, message, BUF_SIZE)) != 0){
            write(clnt_sock, message, str_len);
        }

        close(clnt_sock);
    }
    close(serv_sock);
    return 0;
}

客戶端:

// gcc echo_client.c -o echo_client
// ./echo_client 127.0.0.1 9190

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 1024

void error_handling(char *message){
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

int main(int argc, char *argv[]){
    int sock;
    char message[BUF_SIZE];
    int str_len;
    struct sockaddr_in serv_adr;

    if(argc != 3){
        printf("Usage : %s <IP> <port>\n", argv[0]);
        exit(1);
    }

    sock = socket(PF_INET, SOCK_STREAM, 0);
    if(sock == -1){
        error_handling("socket() error");
    }

    memset(&serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = inet_addr(argv[1]);
    serv_adr.sin_port = htons(atoi(argv[2]));

    if(connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr)) == -1){
        error_handling("connect() error!");
    }
    else{
        puts("Connected.......");
    }

    while(1){
        fputs("Input message(Q to quit): ", stdout);
        fgets(message, BUF_SIZE, stdin);

        if(!strcmp(message, "q\n") || !strcmp(message, "Q\n")){
            break;
        }

        write(sock, message, strlen(message));
        str_len = read(sock, message, BUF_SIZE-1);
        message[str_len] = 0;
        printf("Message from server: %s", message);
    }

    close(sock);
    return 0;
}   

運(yùn)行結(jié)果:

《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于TCP的服務(wù)器端/客戶端,網(wǎng)絡(luò)編程筆記,tcp/ip

5--Windows實(shí)現(xiàn)迭代回聲服務(wù)器端/客戶端

服務(wù)器端:

// gcc echo_server_win.c -o echo_server_win -lwsock32
// echo_server_win 9190

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>

#define BUF_SIZE 1024

void ErrorHandling(char *message){
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

int main(int argc, char *argv[]){
    WSADATA wsaData;
    SOCKET hServSock, hClntSock;
    char message[BUF_SIZE];
    int strLen, i;

    SOCKADDR_IN servAdr, clntAdr;
    int clntAdrSize;

    if(argc != 2){
        printf("Usage : %s <port>\n", argv[0]);
        exit(1);
    }

    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){
        ErrorHandling("WSAStartup() error!");
    }

    hServSock = socket(PF_INET, SOCK_STREAM, 0);
    if(hServSock == INVALID_SOCKET){
        ErrorHandling("socket() error");
    }

    memset(&servAdr, 0, sizeof(servAdr));
    servAdr.sin_family = AF_INET;
    servAdr.sin_addr.s_addr = htonl(INADDR_ANY);
    servAdr.sin_port = htons(atoi(argv[1]));

    if(bind(hServSock, (SOCKADDR*)&servAdr, sizeof(servAdr)) == SOCKET_ERROR){
        ErrorHandling("bind() error");
    }

    if(listen(hServSock, 5) == SOCKET_ERROR){
        ErrorHandling("listen() error");
    }

    clntAdrSize = sizeof(clntAdr);

    for(int i = 0; i < 5; i++){
        hClntSock = accept(hServSock, (SOCKADDR*)&clntAdr, &clntAdrSize);
        if(hClntSock == -1){
            ErrorHandling("accept() error");
        }
        else{
            printf("Connected client %d \n", i + 1);
        }
        while((strLen = recv(hClntSock, message, BUF_SIZE, 0)) != 0){
            send(hClntSock, message, strLen, 0);
        }
        closesocket(hClntSock);
    }
    closesocket(hServSock);
    WSACleanup();
    return 0;
}

客戶端:

// gcc echo_client_win.c -o echo_client_win -lwsock32
// echo_client_win 127.0.0.1 9190

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>

#define BUF_SIZE 1024

void ErrorHandling(char *message){
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

int main(int argc, char *argv[]){
    WSADATA wsaData;
    SOCKET hSocket;
    char message[BUF_SIZE];
    int strLen;
    SOCKADDR_IN servAdr;

    if(argc != 3){
        printf("Usage: %s <IP> <port>\n", argv[0]);
        exit(1);
    }

    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){
        ErrorHandling("WSAStartup() error!");
    }

    hSocket = socket(PF_INET, SOCK_STREAM, 0);
    if(hSocket == INVALID_SOCKET){
        ErrorHandling("socket() error");
    }

    memset(&servAdr, 0, sizeof(servAdr));
    servAdr.sin_family = AF_INET;
    servAdr.sin_addr.s_addr = inet_addr(argv[1]);
    servAdr.sin_port = htons(atoi(argv[2]));

    if(connect(hSocket, (SOCKADDR*)&servAdr, sizeof(servAdr)) == SOCKET_ERROR){
        ErrorHandling("connect() error!");
    }
    else{
        puts("Connected........");
    }

    while(1){
        fputs("Input message(Q to quit): ", stdout);
        fgets(message, BUF_SIZE, stdin);

        if(!strcmp(message, "q\n") || !strcmp(message, "Q\n")){
            break;
        }

        send(hSocket, message, strlen(message), 0);
        strLen = recv(hSocket, message, BUF_SIZE - 1, 0);
        message[strLen] = 0;
        printf("Message from server: %s", message);
    }
    closesocket(hSocket);
    WSACleanup();
    return 0;
}

測(cè)試結(jié)果:

《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于TCP的服務(wù)器端/客戶端,網(wǎng)絡(luò)編程筆記,tcp/ip

6--TCP原理

I/O緩沖:

? ? ? ? 當(dāng)調(diào)用 write() 函數(shù)后并不會(huì)立即傳輸數(shù)據(jù),而是將數(shù)據(jù)移至輸出緩沖;

????????同樣當(dāng)調(diào)用 read() 函數(shù)后也并不會(huì)馬上接收數(shù)據(jù),而是將數(shù)據(jù)移至輸入緩沖;

? ? ? ? TCP會(huì)控制數(shù)據(jù)流,使用滑動(dòng)窗口協(xié)議(參考博主之前的筆記:TCP流量控制)來(lái)限制數(shù)據(jù)傳輸不會(huì)超過(guò)輸入緩沖的大??;

TCP 協(xié)議使用三次握手來(lái)建立連接,使用四次揮手來(lái)斷開(kāi)連接;(具體分析參考書(shū)中圖解)

7--Windows實(shí)現(xiàn)計(jì)算器服務(wù)器端/客戶端

服務(wù)器端:

// gcc op_server_win.c -o op_server_win -lwsock32
// op_server_win 9190

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>

#define BUF_SIZE 1024
#define OPSZ 4

void ErrorHandling(char *message){
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

int calculate(int opnum, int opnds[], char op){
    int result = opnds[0], i;
    switch(op){
        case '+':
            for(i = 1; i < opnum; i++) result += opnds[i];
            break;
        case '-':
            for(i = 1; i < opnum; i++) result -= opnds[i];
            break;
        case '*':
            for(i = 1; i < opnum; i++) result *= opnds[i];
            break;
    }
    return result;
}

int main(int argc, char* argv[]){
    WSADATA wsaData;
    SOCKET hServSock, hClntSock;
    char opinfo[BUF_SIZE];
    int result, opndCnt, i;
    int recvCnt, recvLen;
    SOCKADDR_IN servAdr, clntAdr;
    int clntAdrSize;
    if(argc != 2){
        printf("Usage: %s <port>\n", argv[0]);
        exit(1);
    }

    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){
        ErrorHandling("WSAStartup() error!");
    }

    hServSock = socket(PF_INET, SOCK_STREAM, 0);
    if(hServSock == INVALID_SOCKET){
        ErrorHandling("socket() error!");
    }

    memset(&servAdr, 0, sizeof(servAdr));
    servAdr.sin_family = AF_INET;
    servAdr.sin_addr.s_addr = htonl(INADDR_ANY);
    servAdr.sin_port = htons(atoi(argv[1]));

    if(bind(hServSock, (SOCKADDR*)&servAdr, sizeof(servAdr)) == SOCKET_ERROR){
        ErrorHandling("bind() error");
    }

    if(listen(hServSock, 5) == SOCKET_ERROR){
        ErrorHandling("listen() error");
    }

    clntAdrSize = sizeof(clntAdr);

    for(int i = 0; i < 5; i++){
        opndCnt = 0;
        hClntSock = accept(hServSock, (SOCKADDR*)&clntAdr, &clntAdrSize);
        recv(hClntSock, (char*)&opndCnt, 1, 0); // recv one byte

        recvLen = 0;
        while((opndCnt * OPSZ + 1) > recvLen){
            recvCnt = recv(hClntSock, &opinfo[recvLen], BUF_SIZE - 1, 0);
            recvLen += recvCnt;
        }

        result = calculate(opndCnt, (int*)opinfo, opinfo[recvLen - 1]);
        send(hClntSock, (char*)&result, sizeof(result), 0);
        closesocket(hClntSock);
    }

    closesocket(hServSock);
    WSACleanup();
    return 0;
}

客戶端:

// gcc op_client_win.c -o op_client_win -lwsock32
// op_client_win 127.0.0.1 9190

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>

#define BUF_SIZE 1024
#define RLT_SIZE 4
#define OPSZ 4

void ErrorHandling(char *message){
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

int main(int argc, char* argv[]){
    WSADATA wsaData;
    SOCKET hSocket;
    char opmsg[BUF_SIZE];
    int result, opndCnt, i;
    SOCKADDR_IN servAdr;
    if(argc != 3){
        printf("Usage : %s <IP> <port>\n", argv[0]);
        exit(1);
    }

    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0){
        ErrorHandling("WSAStartup() error!");
    }

    hSocket = socket(PF_INET, SOCK_STREAM, 0);
    if(hSocket == INVALID_SOCKET){
        ErrorHandling("socket() error!");
    }

    memset(&servAdr, 0, sizeof(servAdr));
    servAdr.sin_family = AF_INET;
    servAdr.sin_addr.s_addr = inet_addr(argv[1]);
    servAdr.sin_port = htons(atoi(argv[2]));

    if(connect(hSocket, (SOCKADDR*)&servAdr, sizeof(servAdr)) == SOCKET_ERROR){
        ErrorHandling("connect() error!");
    }
    else{
        puts("Connected........");
    }

    fputs("Operand count: ", stdout);
    scanf("%d", &opndCnt);
    opmsg[0] = (char)opndCnt; // one byte

    for(i = 0; i < opndCnt; i++){
        printf("Operand %d: ", i + 1);
        scanf("%d", (int*)&opmsg[i*OPSZ + 1]);
    }

    fgetc(stdin);
    fputs("Operator: ", stdout);
    scanf("%c", &opmsg[opndCnt * OPSZ + 1]); // one byte
    send(hSocket, opmsg, opndCnt * OPSZ + 2, 0);
    recv(hSocket, (char*)&result, RLT_SIZE, 0);

    printf("Operation result: %d \n", result);
    closesocket(hSocket);
    WSACleanup();
    return 0;
}

運(yùn)行結(jié)果:

《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于TCP的服務(wù)器端/客戶端,網(wǎng)絡(luò)編程筆記,tcp/ip文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-695575.html

到了這里,關(guān)于《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于TCP的服務(wù)器端/客戶端的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(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ò)編程》閱讀筆記--多播與廣播

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--多播與廣播

    目錄 1--多播 2--多播代碼實(shí)例 3--廣播 4--廣播代碼實(shí)例 ????????多播方式的數(shù)據(jù)傳輸是基于 UDP 完成的,多播數(shù)據(jù)包的格式與 UDP 數(shù)據(jù)包相同; ? ? ? ? 多播與 UDP 的區(qū)別:UDP 數(shù)據(jù)傳輸以單一目標(biāo)進(jìn)行,多播數(shù)據(jù)同時(shí)傳遞到加入(注冊(cè))特定組的大量主機(jī); 多播的數(shù)據(jù)傳輸

    2024年02月07日
    瀏覽(25)
  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--并發(fā)多進(jìn)程服務(wù)端的使用

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--并發(fā)多進(jìn)程服務(wù)端的使用

    目錄 1--并發(fā)服務(wù)器端 2--進(jìn)程 2-1--進(jìn)程的相關(guān)概念 2-2--fork()創(chuàng)建進(jìn)程 2-3--僵尸進(jìn)程 2-4--wait()和waitpid()銷毀僵尸進(jìn)程 3--信號(hào)處理 3-1--signal()函數(shù) 3-2--sigaction()函數(shù) 3--3--利用信號(hào)處理技術(shù)消滅僵尸進(jìn)程 4--基于多任務(wù)的并發(fā)服務(wù)器 5--分割 TCP 的 I/O 程序 并發(fā)服務(wù)器端主要有以下三類

    2024年02月09日
    瀏覽(21)
  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--getsockopt和setsockopt的使用

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--getsockopt和setsockopt的使用

    目錄 1--Socket的多種可選項(xiàng) 2--getsocketopt() 3--setsockopt() 4--代碼實(shí)例 ? ? ? ? Socket 擁有多種可選項(xiàng),其可分為 SOL_SOCKET 層,IPPROTO_IP 層和IPPROTO_TCP 層等,一般通過(guò) getsocketopt() 和 setsockopt() 函數(shù)進(jìn)行獲取和設(shè)置; ① 基于? getsockopt() 函數(shù),利用設(shè)置協(xié)議層為 SOL_SOCKET 和 SO_TYPE 可選項(xiàng)

    2024年02月09日
    瀏覽(47)
  • 《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)過(guò)四次揮手過(guò)程后,其 Socket 不會(huì)馬上消除,而是會(huì)處于一個(gè) Time-wait 狀態(tài)的階段,此時(shí) Socket 擁有的 端口號(hào)并沒(méi)有得到釋放 ,因此 不能使用相同的端口號(hào) ; ? ? ? ? 只有先斷開(kāi)連接

    2024年02月09日
    瀏覽(34)
  • TCP IP網(wǎng)絡(luò)編程(四) 基于TCP的服務(wù)器端、客戶端

    TCP IP網(wǎng)絡(luò)編程(四) 基于TCP的服務(wù)器端、客戶端

    TCP/IP協(xié)議棧 ? TCP/IP協(xié)議棧 TCP/IP協(xié)議棧共分為4層,可以理解為數(shù)據(jù)收發(fā)分成了4個(gè)層次化過(guò)程。 ? TCP協(xié)議棧 ? UDP協(xié)議棧 鏈路層 鏈路層是物理連接領(lǐng)域標(biāo)準(zhǔn)化的結(jié)果,也是最基本的領(lǐng)域,專門定義LAN、WAN、MAN等網(wǎng)絡(luò)標(biāo)準(zhǔn)。兩臺(tái)主機(jī)通過(guò)網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)交換,這需要像下圖所示

    2024年01月16日
    瀏覽(18)
  • TCP IP網(wǎng)絡(luò)編程(五) 基于TCP的服務(wù)器端、客戶端 (補(bǔ)充)

    TCP IP網(wǎng)絡(luò)編程(五) 基于TCP的服務(wù)器端、客戶端 (補(bǔ)充)

    回聲客戶端出現(xiàn)的問(wèn)題 在上一節(jié)基于TCP的服務(wù)器端、回聲客戶端中,存在問(wèn)題: 如果數(shù)據(jù)太大,操作系統(tǒng)就有可能把數(shù)據(jù)分成多個(gè)數(shù)據(jù)包發(fā)送到客戶端,客戶端有可能在尚未收到全部數(shù)據(jù)包時(shí)就調(diào)用read函數(shù) 問(wèn)題出在客戶端,而不是服務(wù)器端,先來(lái)對(duì)比一下客戶端與服務(wù)器端

    2024年02月09日
    瀏覽(37)
  • Socket網(wǎng)絡(luò)編程(TCP/IP)實(shí)現(xiàn)服務(wù)器/客戶端通信。

    Socket網(wǎng)絡(luò)編程(TCP/IP)實(shí)現(xiàn)服務(wù)器/客戶端通信。

    一.前言 回顧之前進(jìn)程間通信(無(wú)名管道,有名管道,消息隊(duì)列,共享內(nèi)存,信號(hào),信號(hào)量),都是在同一主機(jī)由內(nèi)核來(lái)完成的通信。 那不同主機(jī)間該怎么通信呢? 可以使用Socket編程來(lái)實(shí)現(xiàn)。 Socket編程可以通過(guò)網(wǎng)絡(luò)來(lái)實(shí)現(xiàn)實(shí)現(xiàn)不同主機(jī)之間的通訊。 二.Socket編程的網(wǎng)絡(luò)模型如

    2024年02月08日
    瀏覽(37)
  • Linux 網(wǎng)絡(luò)編程學(xué)習(xí)筆記——一、TCP/IP 協(xié)議族

    Linux 網(wǎng)絡(luò)編程學(xué)習(xí)筆記——一、TCP/IP 協(xié)議族

    數(shù)據(jù)鏈路層實(shí)現(xiàn)了網(wǎng)卡接口的網(wǎng)絡(luò)驅(qū)動(dòng)程序,以處理數(shù)據(jù)在物理媒介(以太網(wǎng)、令牌環(huán)等)上的傳輸,不同的物理網(wǎng)絡(luò)具有不同的電氣特性,網(wǎng)絡(luò)驅(qū)動(dòng)程序隱藏了這些細(xì)節(jié),為上層協(xié)議提供一個(gè)統(tǒng)一的接口。最常用的協(xié)議是 ARP(Address Resolve Protocol,地址解析協(xié)議)和 RARP(

    2024年02月02日
    瀏覽(40)
  • Linux網(wǎng)絡(luò)編程之TCP/IP實(shí)現(xiàn)高并發(fā)網(wǎng)絡(luò)服務(wù)器設(shè)計(jì)指南

    目錄 引言: 多進(jìn)程服務(wù)器 例程分享: 多線程服務(wù)器 ?例程分享: I/O多路復(fù)用服務(wù)器 select 例程分享: poll 例程分享: epoll 例程分享: 總結(jié)建議 ????????隨著互聯(lián)網(wǎng)的迅猛發(fā)展,服務(wù)器面臨著越來(lái)越多的并發(fā)請(qǐng)求。如何設(shè)計(jì)一個(gè)能夠高效處理大量并發(fā)請(qǐng)求的服務(wù)器成為

    2024年02月20日
    瀏覽(33)
  • 網(wǎng)絡(luò)編程day2——基于TCP/IP協(xié)議的網(wǎng)絡(luò)通信

    ? ? ? ? 計(jì)算機(jī)S ? ? ? ? ? ? ? ? ? ? ? ? ????????????????????????計(jì)算機(jī)C ? ? ?創(chuàng)建socket對(duì)象 ? ? ? ? ? ? ? ? ????????????????? 創(chuàng)建socket對(duì)象 ? ? ?準(zhǔn)備通信地址(自己的ip(非公網(wǎng)ip))? ? ? 準(zhǔn)備通信地址 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (計(jì)算

    2024年02月10日
    瀏覽(40)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包