www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 公眾號精選 > 混說Linux
[導讀]TCP 是基于連接的數(shù)據流的協(xié)議,先建立連接再進行通信,而且在通信過程中會檢查數(shù)據是否發(fā)送成功。優(yōu)點就是保證數(shù)據的完整性和準確性,缺點就是效率較低。

TCP 是基于連接的數(shù)據流的協(xié)議,先建立連接再進行通信,而且在通信過程中會檢查數(shù)據是否發(fā)送成功。優(yōu)點就是保證數(shù)據的完整性和準確性,缺點就是效率較低。


TCP的實現(xiàn):




服務器




1. 創(chuàng)建一個socket

int socket(int domain, int type, int protocol);


2. 準備通信地址

struct sockaddr_in // ipv4地址結構體{  short sin_family; // 保存地址協(xié)議類型  AF_INET  short sin_port; // 保存端口號  struct in_addr sin_addr; // 保存你需要綁定的ip地址 } struct in_addr{  in_addr_t s_addr; //最終存放大端序ipv4地址的變量 }


在網絡通信中,本地通常使用小端格式存放數(shù)據,網絡路由通常使用大端格式存放數(shù)據,所以需要格式的轉換:
本地轉網絡:

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);


網絡轉本地:

uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);


3. 綁定ip和端口號

int bind(int sockfd, const struct sockaddr *addr, ?socklen_t addrlen);

4. 監(jiān)聽客戶端的連接

int listen(int sockfd, int backlog); // 注:該函數(shù)不阻塞

5. 等待客戶端連接

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); // 注:阻塞函數(shù),有客戶端連接才返回

6. 與客戶端進行通信(read/write    recv/send)

// 接收ssize_t recv(int sockfd, void *buf, size_t len, int flags);// 發(fā)送ssize_t send(int sockfd, const void *buf, size_t len, int flags);


7. 不再通信關閉新socket描述符,不在監(jiān)聽關閉監(jiān)聽的socket描述符

int close(int fd);


示例代碼

int main(){  int tcpsock;  int newsock;  int ret;  char buf[100]; // 定義ipv4地址結構體變量  struct sockaddr_in bindaddr;  bzero(&bindaddr, sizeof(bindaddr));  bindaddr.sin_family = AF_INET;  bindaddr.sin_port = htons(10000); //服務器自己的端口號  bindaddr.sin_addr.s_addr = inet_addr("192.168.11.3"); //服務器自己的ip   struct sockaddr_in clientaddr;  bzero(&clientaddr, sizeof(clientaddr));  int addrsize = sizeof(clientaddr);   // 創(chuàng)建套接字  tcpsock = socket(AF_INET, SOCK_STREAM, 0);  if(tcpsock == -1)  {  perror("創(chuàng)建套接字失敗!");  return -1;  }  //綁定ip和端口號  ret = bind(tcpsock, (struct sockaddr *)&bindaddr, sizeof(bindaddr));  if(ret == -1)  {  perror("綁定失敗");  return -1;  }  //監(jiān)聽  ret = listen(tcpsock, 5);  if(ret == -1)  {  perror("監(jiān)聽失敗");  return -1;  }  // printf("服務器在沒有客戶端連接的情況下,阻塞在accept!\n");   // 接受客戶端的連接請求  newsock = accept(tcpsock, (struct sockaddr *)&clientaddr, &addrsize);  if(newsock == -1)  {  perror("接受客戶端的連接請求失敗");  return -1;  }  // printf("服務器的代碼中產生的舊套接字:%d\n", tcpsock);  // printf("服務器的代碼中產生的新套接字:%d\n", newsock);   // 讀取客戶端發(fā)送過來的信息  while(1)  {  bzero(buf, 100);  read(newsock, buf, 100);  printf("客戶端發(fā)送過來的信息:%s\n", buf);  }}


客戶端




1. 創(chuàng)建一個socket


2. 準備通信地址


3. 連接服務器

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);// 和 bind()的參數(shù)一樣

4. 與服務器進行通信

5. 不再通信關閉socket描述符


示例代碼

int main(){  int tcpsock;  int ret;  char buf[100];  // 定義ipv4地址結構體變量  struct sockaddr_in bindaddr;  bzero(&bindaddr, sizeof(bindaddr));  bindaddr.sin_family = AF_INET;  bindaddr.sin_port = htons(10086); // 自己指定一個端口號  bindaddr.sin_addr.s_addr = inet_addr("192.168.11.3"); // 綁定自己的ip   struct sockaddr_in serveraddr;  bzero(&serveraddr, sizeof(serveraddr));  serveraddr.sin_family = AF_INET;  serveraddr.sin_port = htons(10000); // 服務器端口號  serveraddr.sin_addr.s_addr = inet_addr("192.168.11.3"); // 服務器的ip   // 創(chuàng)建套接字  tcpsock = socket(AF_INET, SOCK_STREAM, 0);  if(tcpsock == -1)  {  perror("創(chuàng)建套接字失敗!\n");  return -1;  }  // 連接服務器  ret = connect(tcpsock, (struct sockaddr *)&serveraddr, sizeof(serveraddr));  if(ret == -1)  {  perror("連接服務器失敗");  return -1;  }  // 發(fā)送信息給服務器  while(1)  {  bzero(buf, 100);  printf("請輸入要發(fā)送給服務器的信息!\n");  scanf("%s", buf);  write(tcpsock, buf, strlen(buf));  }}
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

在工業(yè)自動化領域,Modbus協(xié)議憑借其開放性和易用性成為設備通信的"通用語言"。然而,當工程師面對Modbus RTU、ASCII和TCP三種變體時,如何根據具體場景做出最優(yōu)選擇?本文將從編碼機制、通信效率、錯誤檢測等...

關鍵字: Modbus協(xié)議 TCP

在人工智能飛速發(fā)展的當下,大模型展現(xiàn)出了強大的語言理解與生成能力。然而,要讓這些模型真正在實際場景中發(fā)揮作用,與外部豐富的工具及數(shù)據源順暢交互至關重要。在此背景下,Model Context Protocol(MCP),...

關鍵字: 人工智能 大模型 協(xié)議

上海2025年8月13日 /美通社/ -- 8月12日,富士膠片(中國)投資有限公司(以下簡稱"富士膠片(中國)")在北京舉行FUJIFILM LTO Ultrium 10(以下簡稱"LTO...

關鍵字: 富士 數(shù)據流 數(shù)據存儲 AI

TCP/IP(Transmission Control Protocol/Internet Protocol,傳輸控制協(xié)議/網際協(xié)議)是指能夠在多個不同網絡間實現(xiàn)信息傳輸?shù)膮f(xié)議簇。TCP/IP協(xié)議不僅僅指的是TCP 和I...

關鍵字: TCP IP

在智能汽車飛速發(fā)展的當下,汽車內各種電氣設備之間的數(shù)據交互愈發(fā)頻繁和復雜。車載以太網作為連接這些設備的關鍵物理網絡,正扮演著日益重要的角色。它基于傳統(tǒng)以太網協(xié)議,對物理接口電氣特性進行了改造,并依據車載網絡需求制定了新標...

關鍵字: 以太網 車載網絡 協(xié)議

把TCP首部想象成一封信的信封,每個字段對應信封上的不同信息。源端口和目的端口就像寄信人和收信人的門牌號,序列號和確認號相當于書信的頁碼編號和回執(zhí)編號。數(shù)據偏移量可以比作信封上留出的貼郵票位置,保留字段就像信封上預留的空...

關鍵字: TCP 首部信息

I2C 總線的起始條件和終止條件通常由主機產生。起始條件是在 SCL 高電平時,SDA 從高電平轉為低電平;而終止條件則是當 SCL 高電平時,SDA 從低電平轉化為高電平。這兩個條件的準確識別對于 I2C 通信的正確啟...

關鍵字: I2C 總線 數(shù)據 協(xié)議

三次握手的目的,確保雙方都能正常通信,確認雙方的發(fā)送和接收能力正常。可能舉一個生活中的例子,比如打電話時的確認過程。

關鍵字: TCP 通信

服務器接收請求是一個涉及網絡層(IP/端口綁定)、傳輸層(UDP/TCP/TLS 適配)、應用層(SIP 協(xié)議解析)

關鍵字: 服務器 TCP UDP

在當今數(shù)字化時代,互聯(lián)網已經成為人們生活和工作中不可或缺的一部分。從瀏覽網頁、發(fā)送電子郵件,到視頻通話、在線購物,每一項網絡活動的背后都離不開一套復雜而精妙的協(xié)議體系 ——TCP/IP 協(xié)議族。作為支撐現(xiàn)代互聯(lián)網運行的基...

關鍵字: 協(xié)議 互聯(lián)網 TCP/IP 協(xié)議
關閉