【揭秘TCP原理】C語言實現網絡編程實戰案例詳解

提問者:用戶FYXQ 發布時間: 2025-05-19 12:23:20 閱讀時間: 3分鐘

最佳答案

引言

TCP(傳輸把持協定)是互聯網上利用最為廣泛的傳輸層協定之一,它供給了堅固的、面向連接的效勞。本文將深刻探究TCP的道理,並經由過程C言語實現一個簡單的TCP效勞器跟客戶端,以幫助讀者更好地懂得TCP的任務機制。

TCP道理概述

1. 面向連接

TCP是一種面向連接的協定,這意味着在數據傳輸之前,客戶端跟效勞器之間須要樹破一個連接。這個過程稱為「三次握手」。

2. 堅固傳輸

TCP確保數據堅固傳輸,經由過程序列號、確認應對、重傳機制等手段實現。

3. 流量把持

TCP經由過程滑動窗口機制實現流量把持,避免發送方發送的數據過多,招致接收方無法處理。

4. 擁塞把持

TCP經由過程慢啟動、擁塞避免、疾速重傳跟疾速恢復等算法實現擁塞把持,確保收集牢固。

C言語實現TCP效勞器跟客戶端

1. 效勞器端代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);

    // 創建 socket 文件描述符
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // 強迫綁定到端口 8080
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(8080);

    // 綁定 socket 到端口 8080
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // 監聽連接
    if (listen(server_fd, 3) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    // 接收連接
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }

    // 讀取數據
    char buffer[1024] = {0};
    read(new_socket, buffer, 1024);
    printf("Message from client: %s\n", buffer);

    // 封閉連接
    close(new_socket);
    close(server_fd);
    return 0;
}

2. 客戶端代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

int main() {
    int sock = 0;
    struct sockaddr_in serv_addr;
    char buffer[1024] = {0};
    char *hello = "Hello from client";

    // 創建 socket 文件描述符
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("\n Socket creation error \n");
        return -1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(8080);

    // 獲取當地 IP 地點
    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {
        printf("\nInvalid address/ Address not supported \n");
        return -1;
    }

    // 連接到效勞器
    if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
        printf("\nConnection Failed \n");
        return -1;
    }

    // 發送數據
    send(sock, hello, strlen(hello), 0);
    printf("Hello message sent\n");

    // 讀取效勞器呼應
    read(sock, buffer, 1024);
    printf("Server : %s\n", buffer);

    // 封閉連接
    close(sock);
    return 0;
}

總結

本文經由過程C言語實現了TCP效勞器跟客戶端,幫助讀者懂得TCP的任務道理。在現實利用中,TCP協定的很多細節須要深刻研究跟進修,但本文供給的案例可能幫助讀者入門並為進一步進修打下基本。

相關推薦