引言
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協定的很多細節須要深刻研究跟進修,但本文供給的案例可能幫助讀者入門並為進一步進修打下基本。