TCP編程詳解

一、TCP編程思政

TCP(Transmission Control Protocol)是一種面向連接的協議,通常用於可靠的數據傳輸。在互聯網中,TCP是應用最廣泛的傳輸層協議之一,TCP編程也是網絡編程中必須學習的一部分。

而作為一名優秀的編程工程師,需要具備良好的思政能力。TCP編程並不僅僅是一種技術,而更是一種傳遞信息和交流的方式,需要我們牢記網絡安全、規範和道德等多方面的要求,保障網絡交流的有效、安全和順暢。

二、TCP/IP網絡編程

TCP/IP是Internet協議族中最基本、最常用的協議之一。TCP/IP網絡編程也就成為了網絡編程的基礎。TCP/IP網絡編程的實現過程基於Socket和網絡套接字,可以實現進程間通信及跨網絡的通信。通過TCP/IP網絡編程可以實現同一台計算機上的進程之間的通信,也可以實現不同計算機之間的通信。

三、TCP編程實際步驟

進行TCP編程的實際步驟如下:
1、創建一個 Socket 實例
2、綁定 IP 和端口
3、監聽連接
4、接受連接
5、發送數據
6、接收數據
7、關閉 Socket

四、TCP編程語言排名

TCP編程可用於多種編程語言,但不同編程語言的實現方式略有區別。如下表列出了一些常用編程語言的TCP編程使用率,僅供參考:

C語言:71%
Java:10%
Python:4%
C#:3%
PHP:2%

五、TCP編程C語言

C語言是TCP編程使用最為廣泛的語言之一,許多網絡協議的實現都採用C語言。以下為C語言實現TCP客戶端的基本步驟,供參考:
(1)創建套接字:

int sockfd = socket(AF_INET,SOCK_STREAM,0);

(2)服務器的地址和端口,客戶端通過它進行連接:

struct sockaddr_in serv_addr;
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(8000);
serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");

(3)連接服務器:

connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));

(4)發送數據:

send(sockfd,data,sizeof(data),0);

(5)接收數據:

recv(sockfd,buffer,sizeof(buffer),0);

(6)關閉套接字:

close(sockfd);

六、TCP編程在服務器的流程

TCP編程服務器端主要包括以下步驟:
(1)創建服務器Socket,指定協議和端口號

int sockfd=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in serv_addr;
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(8000);
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
bind(sockfd,(struct sockaddr*)&serv_addr,
sizeof(serv_addr));

(2)監聽客戶端請求

listen(sockfd,128);

(3)建立客戶端連接

struct sockaddr_in client_addr;
socklen_t client_addr_length=sizeof(client_addr);
int clientfd=accept(sockfd,(struct sockaddr*)&client_addr,
&client_addr_length);

(4)接收客戶端消息

recv(clientfd,buf,sizeof(buf),0);

(5)向客戶端發送消息

send(clientfd,msg,strlen(msg),0);

(6)關閉客戶端Socket,斷開連接

close(clientfd);

七、TCP編程流程

TCP編程需要按照以下基本流程進行:
(1)創建Socket:使用socket()函數創建Socket,獲取Socket描述符。
(2)綁定Socket:使用bind()函數設計Socket的IP地址和端口號。
(3)監聽Socket:使用listen()函數監聽Socket端口,等待客戶端連接請求。
(4)接受連接:使用accept()函數接受客戶端連接請求,獲取到新的Socket到套接字描述符。
(5)接收數據:使用recv()函數接收客戶端請求的數據或信息。
(6)發送數據:使用send()函數將服務端感興趣的信息發送給客戶端。
(7)關閉Socket:使用close()函數關閉Socket連接,釋放Socket資源。

八、TCP編程Socket阻塞函數

Socket在進行TCP編程時,阻塞是非常常見的現象。以下為兩種常見的阻塞函數解決方法:
(1)阻塞函數一:accept()
accept()函數會一直等待客戶端連接,在沒有連接到來的情況下會一直阻塞。解決方法是設定接收客戶端連接請求的超時時間。例如:

struct timeval timeout;
timeout.tv_sec=5;
timeout.tv_usec=0;
setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&timeout,
sizeof(timeout));

(2)阻塞函數二:send()和recv()
send()和recv()函數在數據未準備好時也會發生阻塞,甚至會一直阻塞。解決方法是使用非阻塞I/O,即在socket調用時加入O_NONBLOCK屬性(使用位運算)。例如:

fcntl(sockfd,F_SETFL,O_NONBLOCK);

九、TCP編程聊天室

TCP編程可以實現多人在線聊天室,以下是一個簡單的聊天室實現:
①服務端:
(1)創建Socket,綁定IP地址和端口號,監聽連接請求;
(2)接收客戶端連接並加入socket列表,同時開闢線程阻塞接收socket數據;
(3)將客戶端發送的消息分析並廣播給所有在線客戶端;
(4)當客戶端離線時,從socket列表中刪除該客戶端。
②客戶端:
(1)建立TCP連接;
(2)開闢線程阻塞接收服務端socket數據;
(3)向服務端發送消息;
(4)退出聊天室並關閉socket連接連接;
具體實現過程詳見附錄代碼。

原創文章,作者:GUSR,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/131491.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
GUSR的頭像GUSR
上一篇 2024-10-03 23:45
下一篇 2024-10-03 23:45

相關推薦

  • NodeJS 建立TCP連接出現粘包問題

    在TCP/IP協議中,由於TCP是面向字節流的協議,發送方把需要傳輸的數據流按照MSS(Maximum Segment Size,最大報文段長度)來分割成若干個TCP分節,在接收端…

    編程 2025-04-29
  • TCP發送的數據包發布全

    TCP協議是一種可靠的面向連接的協議,而數據包的發送則是其重要組成部分,本文將從多個方面對TCP發送的數據包發布全進行詳細闡述。 一、數據包的概念 數據包指的是網絡傳輸過程中,為了…

    編程 2025-04-27
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性傳感器,能夠同時測量加速度和角速度。它由三個傳感器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變量讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分布式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25

發表回復

登錄後才能評論