国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

58網(wǎng)站怎么做優(yōu)化迅雷磁力鏈bt磁力種子

58網(wǎng)站怎么做優(yōu)化,迅雷磁力鏈bt磁力種子,定制網(wǎng)站開發(fā)的意思,layerslider wordpress文章目錄 一、Socket 介紹二、Socket 通信模型三、Socket 常用函數(shù)1 創(chuàng)建套接字2 綁定套接字3、監(jiān)聽連接4、接受連接5、接收和發(fā)送數(shù)據(jù)接收數(shù)據(jù)發(fā)送數(shù)據(jù) 6、關(guān)閉套接字 四、Socket編程試驗1、源碼server.cclient.c 2、編譯:3、執(zhí)行結(jié)果 五、補充TCP和UDP協(xié)議的Socke…

文章目錄

  • 一、Socket 介紹
  • 二、Socket 通信模型
  • 三、Socket 常用函數(shù)
    • 1 創(chuàng)建套接字
    • 2 綁定套接字
    • 3、監(jiān)聽連接
    • 4、接受連接
    • 5、接收和發(fā)送數(shù)據(jù)
      • 接收數(shù)據(jù)
      • 發(fā)送數(shù)據(jù)
    • 6、關(guān)閉套接字
  • 四、Socket編程試驗
    • 1、源碼
      • server.c
      • client.c
    • 2、編譯:
    • 3、執(zhí)行結(jié)果
  • 五、補充TCP和UDP協(xié)議的Socket流程對比
    • 1、TCP 和 和 UDP區(qū)別
    • 2、TCP工作流程圖
    • 3、UDP工作流程圖


一、Socket 介紹

所謂socket通常也稱作 “套接字”,用于描述IP地址和端口,是一個通信鏈的句柄。應(yīng)用程序通常通過 “套接字” 向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求 。
Socket 是計算機網(wǎng)絡(luò)編程中一個重要的概念,它是在應(yīng)用層和傳輸層之間提供的一種抽象接口,用于實現(xiàn)應(yīng)用程序之間的數(shù)據(jù)交換。Socket 允許程序員使用一種通用的接口來訪問底層傳輸協(xié)議,如 TCP 和 UDP,以便進行網(wǎng)絡(luò)通信。
Socket 是一種編程接口,它提供了一種標(biāo)準(zhǔn)化的方式來創(chuàng)建網(wǎng)絡(luò)連接,并允許應(yīng)用程序在網(wǎng)絡(luò)上發(fā)送和接收數(shù)據(jù)。Socket API 提供了一組函數(shù),這些函數(shù)可以用于創(chuàng)建和配置套接字,建立連接,發(fā)送和接收數(shù)據(jù),以及關(guān)閉連接等操作。
Socket 包括流式 Socket(基于 TCP)數(shù)據(jù)報式 Socket(基于 UDP),其中,TCP面向連接,可靠性較高,可實現(xiàn)有序、零差錯的傳輸;而 UDP 不能確保傳輸?shù)臄?shù)據(jù)按序、及時到達,因此,UDP 主要出現(xiàn)在數(shù)據(jù)可靠性要求較低的場合。常見的 Socket 編程相關(guān)術(shù)語進行介紹:

相關(guān)術(shù)語介紹
IP 地址唯一標(biāo)識了網(wǎng)絡(luò)上的一臺主機
端口號是一個 16 位數(shù)字,用于標(biāo)識一個應(yīng)用程序在主機上的具體位置
套接字用于標(biāo)識一條網(wǎng)絡(luò)連接的兩端,包含 IP 地址和端口號
服務(wù)器在網(wǎng)絡(luò)上提供服務(wù)的主機
客戶端與服務(wù)器進行通信的主機

一 個Socket 主要由5個信息所構(gòu)成,分別為:協(xié)議,本地地址,本地端口號,遠地地址,遠地端口號。

  • 協(xié)議指定了socket所使用的的通訊協(xié)議,一般有TCP或者UDP等。
  • 本地IP地址即本地主機的地址。
  • 本地端口號用以和本地運行的其他程序所區(qū)分。
  • 遠地IP地址即依照網(wǎng)絡(luò)協(xié)議分配給遠程主機的網(wǎng)絡(luò)地址。
  • 遠地端口號用以和遠程主機運行的其他程序所區(qū)分。

二、Socket 通信模型

Socket 編程通常分為兩個部分:服務(wù)器端和客戶端。
服務(wù)器端監(jiān)聽一個指定的端口,等待客戶端連接。一旦客戶端連接到服務(wù)器端,服務(wù)器端將創(chuàng)建一個新的套接字來處理該客戶端的請求。服務(wù)器可以同時處理多個客戶端請求,每個客戶端都會有自己的套接字連接。
客戶端首先創(chuàng)建一個套接字,然后連接到服務(wù)器端的指定 IP 地址和端口號。一旦連接建立,客戶端可以通過套接字發(fā)送和接收數(shù)據(jù)??蛻舳送ǔJ且淮涡赃B接,一旦任務(wù)完成就關(guān)閉套接字。
在這里插入圖片描述
Socket 編程可以用于各種不同的應(yīng)用程序,例如聊天程序、文件傳輸、在線游戲等。Socket編程還可以用于創(chuàng)建網(wǎng)絡(luò)服務(wù)器,提供 Web 服務(wù)、FTP 服務(wù)、郵件服務(wù)等。

三、Socket 常用函數(shù)

socket 編程的系統(tǒng)調(diào)用常用函數(shù)如下所示:

  • 創(chuàng)建套接字 socket(domain, type, protocol)
  • 綁定套接字 bind(sockfd, addr, addrlen)
  • 監(jiān)聽連接 listen(sockfd, backlog)
  • 接受連接 accept(sockfd, addr, addrlen)
  • 接收和發(fā)送數(shù)據(jù) recv(sockfd, buf, len, flags)、send(sockfd, buf, len, flags)
  • 關(guān)閉套接字 close(sockfd)

1 創(chuàng)建套接字

在 Linux socket 編程中,創(chuàng)建套接字是構(gòu)建網(wǎng)絡(luò)應(yīng)用程序的第一步。套接字可以理解為應(yīng)用程序和網(wǎng)絡(luò)之間的橋梁,用于在網(wǎng)絡(luò)上進行數(shù)據(jù)的收發(fā)和處理。在 Linux 中,可以使用 socket 系統(tǒng)調(diào)用創(chuàng)建套接字。該系統(tǒng)調(diào)用的原型和所需頭文件如下所示:

#include <sys/types.h>
#include <sys/socket.h>
int socket( (int domain, int type, int protocol );

其中,domain 參數(shù)指定了套接字的協(xié)議族,type 參數(shù)指定了套接字的類型,protocol 參數(shù)指定了套接字所使用的具體協(xié)議。下面分別介紹這三個參數(shù)的含義:

  • 協(xié)議族
    協(xié)議族指定了套接字所使用的協(xié)議類型,常用的協(xié)議族包括 AF_INET、AF_INET6、AF_UNIX等。其中,AF_INET 表示 IPv4 協(xié)議族,AF_INET6 表示 IPv6 協(xié)議族,AF_UNIX 表示 Unix 域協(xié)議族。
  • 套接字類型
    套接字類型指定了套接字的數(shù)據(jù)傳輸方式,常用的套接字類型包括 SOCK_STREAM、SOCK_DGRAM、SOCK_RAW 等。其中,SOCK_STREAM 表示面向連接的流套接字,主要用于可靠傳輸數(shù)據(jù),例如 TCP 協(xié)議。SOCK_DGRAM 表示無連接的數(shù)據(jù)報套接字,主要用于不可靠傳輸數(shù)據(jù),例如 UDP 協(xié)議。SOCK_RAW 表示原始套接字,可以直接訪問底層網(wǎng)絡(luò)協(xié)議。
  • 協(xié)議類型
    協(xié)議類型指定了套接字所使用的具體協(xié)議類型,常用的協(xié)議類型包括 IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP 等。其中,IPPROTO_TCP 表示 TCP 協(xié)議,IPPROTO_UDP 表示 UDP協(xié)議,IPPROTO_ICMP 表示 ICMP 協(xié)議,通常使用 0 表示由系統(tǒng)自動選擇適合的協(xié)議。
    例如可以使用以下代碼創(chuàng)建一個新的套接字:
int sockfd = = socket(AF_INET, SOCK_STREAM, 0);

2 綁定套接字

創(chuàng)建套接字后,需要將其與一個網(wǎng)絡(luò)地址綁定,以便其他計算機可以訪問該套接字。在 Linux系統(tǒng)下,可以使用 bind()系統(tǒng)調(diào)用綁定套接字和地址。該系統(tǒng)調(diào)用的原型和所需頭文件如下所示:

#include <sys/types.h>
#include <sys/socket.h>
int bind( (int sockfd, const struct sockaddr *addr, socklen_t addrlen);

其中,sockfd 參數(shù)指定了需要綁定的套接字描述符,addr 參數(shù)指定了需要綁定的地址信息,可以是 struct sockaddr_in 或 struct sockaddr_in6 等結(jié)構(gòu)體類型,addrlen 參數(shù)指定了地址信息的長度。使用以下代碼將套接字和地址綁定:

// bind port 
// 創(chuàng)建一個 sockaddr_in 結(jié)構(gòu)體類型的 servaddr 變量用于存儲服務(wù)器的地址信息,并將其清零。
struct sockaddr_in bindaddr;
memset (&bindaddr, 0, sizeof(bindaddr);
bindaddr.sin_family = AF_INET;//指定使用 IPv4 協(xié)議(AF_INET)
bindaddr.sin_addr.s_addr = htonl(INADDR_ANY);//監(jiān)聽本地任意可用的 IP 地址(INADDR_ANY)
bindaddr.sin_port = htons(3000);//使用指定的端口號(port)
// 將套接字 listenfd 綁定到指定的地址 bindaddr上,bind() 函數(shù)返回值為 0 表示綁定成功
if(0 != bind(listenfd, (struct sockaddr *)&bindaddr, sizeof(bindaddr))) {printf("bind error\n");return -1;
}

在初始化 sockaddr_in 結(jié)構(gòu)體時,用到了以下函數(shù):

  • memset() :用來將 sockaddr_in 結(jié)構(gòu)體的各個成員變量初始化為 0,這是一個常用的初始化方式。其函數(shù)原型如下:
 #include <string.h> // s 參數(shù)是需要被初始化的內(nèi)存區(qū)域指針,c 參數(shù)是填充字符,n 參數(shù)是需要填充的內(nèi)存字節(jié)數(shù)。void *memset( void *s, int c, size_t n ); 
  • htonsl()和 和 htons():用于將本機字節(jié)序的端口號轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序的端口號。其函數(shù)原型如下:
 #include <arpa/inet.h> 
uint32_t htonl(uint32_t hostlong );
uint16_t htons(uint16_t hostshort);

其中,hostshort 和 hostlong 參數(shù)是本機字節(jié)序的端口號,函數(shù)返回值是網(wǎng)絡(luò)字節(jié)序的端口號。

3、監(jiān)聽連接

綁定套接字后,需要開始監(jiān)聽連接請求,以便其他網(wǎng)絡(luò)上的客戶端能夠與該套接字建立連接。這一步驟通常在服務(wù)器端完成。在 Linux 系統(tǒng)下,可以使用 listen()系統(tǒng)調(diào)用監(jiān)聽套接字。該系統(tǒng)調(diào)用的原型如下:

#include <sys/socket.h> 
int listen(int socket, int backlog);

其中,sockfd 參數(shù)指定了需要監(jiān)聽的套接字描述符,backlog 參數(shù)指定了連接隊列的長度,即等待接受的連接數(shù)。例如可以使用以下代碼開始監(jiān)聽連接.

// start listen
if (listen(listenfd, 2) != 0) {printf("listem error\n");return -1;
}

4、接受連接

當(dāng)有客戶端請求連接時,需要接受該連接并進行處理。在 Linux 系統(tǒng)下,可以使用 accept(),系統(tǒng)調(diào)用接受連接請求。該系統(tǒng)調(diào)用的原型和所需頭文件如下所示:

#include <sys/socket.h>
int accept (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len);

其中,sockfd 參數(shù)指定了需要接受連接的套接字描述符,addr 參數(shù)用于存儲客戶端的地址信息,addrlen 參數(shù)用于存儲地址信息的長度。使用以下代碼接受連接請求:

// 定義一個 sockaddr_in 結(jié)構(gòu)體,用于存儲客戶端的 IP 地址和端口號
struct sockaddr_in clientaddr;
// 定義一個 socklen_t 類型的變量 clientaddrlen ,用于存儲客戶端地址結(jié)構(gòu)體的長度
socklen_t clientaddrlen = sizeof(clientaddr);// 調(diào)用 accept() 系統(tǒng)調(diào)用,接受客戶端的連接請求,并返回一個新的套接字描述符 connfd,用于與客戶端進行通信。
// accept() 函數(shù)會阻塞程序,直到有客戶端連接到服務(wù)器端。
// listenfd 是服務(wù)端的監(jiān)聽套接字, clientaddr 是指向 sockaddr_in 結(jié)構(gòu)體的指針,用于存儲客戶端的地址信息。
// clientaddrlen 是客戶端地址結(jié)構(gòu)體的長度,accept() 函數(shù)會將實際接受到的客戶端地址長度存儲到該變量中。
int clientfd = accept(listenfd, (struct sockaddr *)&clientaddr, &clientaddrlen);
if (clientfd >= 0) { // 判斷 accept() 函數(shù)的返回值,判斷客戶端連接是否失敗// 處理接收數(shù)據(jù)} else{printf("accept error\n");
}

5、接收和發(fā)送數(shù)據(jù)

在 Linux socket 編程中,接收和發(fā)送數(shù)據(jù)是套接字編程的核心步驟之一。當(dāng)套接字綁定并且處于監(jiān)聽狀態(tài),已經(jīng)成功接受了客戶端的連接請求后,接下來就是進行數(shù)據(jù)的收發(fā)。下面將詳細(xì)介紹如何在 Linux 系統(tǒng)中實現(xiàn)接收和發(fā)送數(shù)據(jù)的過程。

接收數(shù)據(jù)

在接收數(shù)據(jù)之前,需要先了解數(shù)據(jù)在網(wǎng)絡(luò)傳輸中的一些基本概念。在 TCP 協(xié)議中,發(fā)送方發(fā)送的數(shù)據(jù)被分割成一個個 TCP 報文段,每個報文段都包含一個 TCP 首部和數(shù)據(jù)部分。TCP首部中包含了一些控制信息,如序號、確認(rèn)號、窗口大小等,用來保證數(shù)據(jù)的可靠傳輸。而數(shù)據(jù)部分則是發(fā)送方發(fā)送的應(yīng)用層數(shù)據(jù),如 HTTP 報文、FTP 文件等。
在 Linux socket 編程中,接收數(shù)據(jù)的過程分為兩步:先接收 TCP 首部,再接收數(shù)據(jù)部分。具體步驟如下:
(1)創(chuàng)建一個緩沖區(qū)用于接收數(shù)據(jù)。緩沖區(qū)的大小一般為數(shù)據(jù)部分的大小。
(2)調(diào)用 recv() 系統(tǒng)調(diào)用接收數(shù)據(jù)。其函數(shù)原型和所需頭文件如下:

#include <sys/socket.h> 
ssize_t recv(int sockfd, void *buffer, size_t length, int flags );

其中,sockfd 參數(shù)是需要接收數(shù)據(jù)的套接字描述符,buf 參數(shù)是用于存儲接收數(shù)據(jù)的緩沖區(qū)指針,len 參數(shù)是需要接收的數(shù)據(jù)的最大長度,flags 參數(shù)是接收標(biāo)志,通常為 0。函數(shù)返回值為實際接收到的字節(jié)數(shù),如果返回值為 0,表示對端已經(jīng)關(guān)閉連接。
(3)在調(diào)用 recv() 系統(tǒng)調(diào)用時,會先接收 TCP 首部,然后再接收數(shù)據(jù)部分。如果數(shù)據(jù)部分比較大,可能需要多次調(diào)用 recv() 系統(tǒng)調(diào)用才能接收完整的數(shù)據(jù)。因此,需要使用一個循環(huán)來不斷接收數(shù)據(jù),直到接收到全部數(shù)據(jù)或者出現(xiàn)錯誤為止。另外,需要注意的是,recv() 系統(tǒng)調(diào)用是一個阻塞調(diào)用,即程序會一直等待直到接收到數(shù)據(jù)或者出現(xiàn)錯誤才會返回。如果不希望阻塞調(diào)用,可以使用非阻塞 I/O 或者多路復(fù)用技術(shù)。
(4) 處理接收到的數(shù)據(jù)。在數(shù)據(jù)接收完成后,需要對接收到的數(shù)據(jù)進行處理。具體處理方式根據(jù)具體的應(yīng)用場景而定,如將接收到的數(shù)據(jù)顯示在終端上、將數(shù)據(jù)寫入文件等。

發(fā)送數(shù)據(jù)

發(fā)送數(shù)據(jù)的步驟如下:
(1)定義數(shù)據(jù)緩沖區(qū):需要定義一個用于存儲待發(fā)送數(shù)據(jù)的緩沖區(qū),比如 char buf[MAXLINE]。
(2)將數(shù)據(jù)拷貝到緩沖區(qū):將需要發(fā)送的數(shù)據(jù)拷貝到緩沖區(qū)中,可以使用 strcpy()、memcpy() 等函數(shù)進行拷貝操作。
(3)使用 send() 函數(shù)發(fā)送數(shù)據(jù):send() 函數(shù)用于向已經(jīng)建立連接的套接字發(fā)送數(shù)據(jù),其函數(shù)原型如下:

#include <sys/socket.h> 
ssize_t send( int sockfd, const void *buf, size_t len, int flags);

函數(shù)調(diào)用成功將返回發(fā)送數(shù)據(jù)的字節(jié)數(shù)(返回值為非負(fù)數(shù)),返回-1 表示發(fā)送失敗。sockfd 需要發(fā)送數(shù)據(jù)的套接字描述符;buf 待發(fā)送數(shù)據(jù)的緩沖區(qū)指針;len 待發(fā)送數(shù)據(jù)的長度;flags 傳輸標(biāo)志,通常為 0。

// send data
int ret = send(clientfd, buf, strlen(buf), 0);
if (ret != strlen(buf)){printf("send data error\n");return -1;
}

需要注意的是,send() 函數(shù)并不保證一次能夠?qū)⑺袛?shù)據(jù)都發(fā)送出去,如果數(shù)據(jù)量比較大,可能需要多次調(diào)用 send() 函數(shù)才能將所有數(shù)據(jù)發(fā)送出去。
(4)判斷是否發(fā)送完畢:可以通過判斷 send() 函數(shù)的返回值和待發(fā)送數(shù)據(jù)的長度是否相等來確定是否發(fā)送完畢。

6、關(guān)閉套接字

關(guān)閉套接字是一個非常重要的步驟。當(dāng)套接字不再需要使用時,應(yīng)該立即關(guān)閉以釋放系統(tǒng)資源和避免資源浪費。關(guān)閉套接字的步驟非常簡單,只需要調(diào)用 close() 系統(tǒng)調(diào)用即可。close()
系統(tǒng)調(diào)用的函數(shù)原型如下:

int close( (int sockfd );

其中,sockfd 參數(shù)是需要關(guān)閉的套接字描述符。函數(shù)返回值為 0 表示成功,返回值為 -1表示失敗。

四、Socket編程試驗

1、源碼

server.c

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
// 自定義傳輸?shù)臄?shù)據(jù)
typedef struct  msgbuf{int id;char str[32];
} msgbuf;int main() {// create socketint listenfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == listenfd) {printf("create socket error");return -1;}printf("server create socket ok!\n");// bind port // 創(chuàng)建一個 sockaddr_in 結(jié)構(gòu)體類型的 servaddr 變量用于存儲服務(wù)器的地址信息,并將其清零。struct sockaddr_in bindaddr;memset (&bindaddr, 0, sizeof(bindaddr));bindaddr.sin_family = AF_INET;//指定使用 IPv4 協(xié)議(AF_INET)bindaddr.sin_addr.s_addr = htonl(INADDR_ANY);//監(jiān)聽本地任意可用的 IP 地址(INADDR_ANY)bindaddr.sin_port = htons(3000);//使用指定的端口號(port)// 將套接字 listenfd 綁定到指定的地址 bindaddr上,bind() 函數(shù)返回值為 0 表示綁定成功if(0 != bind(listenfd, (struct sockaddr *)&bindaddr, sizeof(bindaddr))) {printf("bind error\n");return -1;}// start listenif (listen(listenfd, 2) != 0) {printf("listem error\n");return -1;}msgbuf socmsg;// 定義一個 sockaddr_in 結(jié)構(gòu)體,用于存儲客戶端的 IP 地址和端口號struct sockaddr_in clientaddr;// 定義一個 socklen_t 類型的變量 clientaddrlen ,用于存儲客戶端地址結(jié)構(gòu)體的長度socklen_t clientaddrlen = sizeof(clientaddr);// accept connection// 調(diào)用 accept() 系統(tǒng)調(diào)用,接受客戶端的連接請求,并返回一個新的套接字描述符 connfd,用于與客戶端進行通信。// accept() 函數(shù)會阻塞程序,直到有客戶端連接到服務(wù)器端。// listenfd 是服務(wù)端的監(jiān)聽套接字, clientaddr 是指向 sockaddr_in 結(jié)構(gòu)體的指針,用于存儲客戶端的地址信息。// clientaddrlen 是客戶端地址結(jié)構(gòu)體的長度,accept() 函數(shù)會將實際接受到的客戶端地址長度存儲到該變量中。int clientfd = accept(listenfd, (struct sockaddr *)&clientaddr, &clientaddrlen);if (clientfd >= 0) { // 判斷 accept() 函數(shù)的返回值,判斷客戶端連接是否失敗while (1) {        	socmsg.id = 0;memset(socmsg.str, ' ',sizeof(socmsg.str));// receive dataint ret = recv(clientfd, &socmsg, sizeof(socmsg), 0);if (ret > 0) {printf("recv data from client, data: %d %s\n", socmsg.id, socmsg.str);printf("send data ...\n");// send dataret = send(clientfd, &socmsg, sizeof(socmsg), 0);if (ret != sizeof(socmsg)) {printf("send data error.\n");}} else {// printf("recv data error.\n");sleep(1);}}		close(clientfd);} else{printf("accept error\n");}//close socketclose(listenfd);return 0;
}

client.c

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>typedef struct  msgbuf{int id;char str[32];
} msgbuf;int main(int argc, const char *argv[]) {char *ip = "192.168.1.100"; // 服務(wù)器默認(rèn)的IP,可以改成服務(wù)器實際IP// create socketint clientfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == clientfd) {printf("create socket error");return -1;}printf("client create socket ok!\n");// connect server struct sockaddr_in serveraddr;serveraddr.sin_family = AF_INET;if (argc == 2) { // 如果有輸入IP參數(shù),使用輸入的IP參數(shù)printf("%s\r\n", argv[1]);serveraddr.sin_addr.s_addr = inet_addr(argv[1]);  // 從命令行參數(shù)中獲取服務(wù)器 IP 地址} else {serveraddr.sin_addr.s_addr = inet_addr(ip);}serveraddr.sin_port = htons(3000);if(-1 == connect(clientfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) {printf("connect error\n");return -1;}printf("connect OK\n");msgbuf socmsg;int i =0;while(1) {sleep(1);socmsg.id = i++;memcpy(socmsg.str,"this is my test msg", strlen("this is my test msg"));// send dataint ret = send(clientfd, &socmsg, sizeof(socmsg), 0);if (ret != sizeof(socmsg)){printf("send data error\n");return -1;}printf("send data ok, %d %s\n",socmsg.id, socmsg.str);// receive datasocmsg.id = 0;// socmsg.str[128] = {0};memset(socmsg.str, ' ',sizeof(socmsg.str));ret = recv(clientfd, &socmsg, sizeof(socmsg), 0);if (ret > 0) {printf("receive data from server: %d %s\n", socmsg.id, socmsg.str);} else {printf("receive data error\n");}}// close socketclose(clientfd);return 0;
}

2、編譯:

gcc -o server server.c
gcc -o client client.c

如果client是在板子上執(zhí)行,需要使用板子系統(tǒng)對應(yīng)的交叉編譯器來編譯。例如:aarch64-linux-gnu-gcc -o client client.c

3、執(zhí)行結(jié)果

在這里插入圖片描述
在這里插入圖片描述
本例程只作為一個簡單的demo,體驗下socket通訊。

五、補充TCP和UDP協(xié)議的Socket流程對比

在一般的網(wǎng)絡(luò)書籍中,網(wǎng)絡(luò)協(xié)議被分為 5 層:
在這里插入圖片描述
?應(yīng)用層:它是體系結(jié)構(gòu)中的最高層,直接為用戶的應(yīng)用進程(例如電子郵件、文件傳輸和終端仿真)提供服務(wù)。在因特網(wǎng)中的應(yīng)用層協(xié)議很多,如支持萬維網(wǎng)應(yīng)用的 HTTP 協(xié)議,支持電子郵件的 SMTP 協(xié)議,支持文件傳送的 FTP , DNS,POP3, SNMP, Telnet 等等。
?運輸層:負(fù)責(zé)向兩個主機中進程之間的通信提供服務(wù)。
運輸層主要使用以下兩種協(xié)議:
① 傳輸控制協(xié)議 TCP(Transmission Control Protocol):面向連接的,數(shù)據(jù)傳輸?shù)膯挝皇菆笪亩?#xff0c;能夠提供可靠的交付。
② 用戶數(shù)據(jù)包協(xié)議 UDP(User Datagram Protocol):無連接的,數(shù)據(jù)傳輸?shù)膯挝皇怯脩魯?shù)據(jù)報,不保證提供可靠的交付,只能提供“盡最大努力交付”。
? 網(wǎng)絡(luò)層:負(fù)責(zé)將被稱為數(shù)據(jù)包(datagram)的網(wǎng)絡(luò)層分組從一臺主機移動到另一臺主機。
? 鏈路層:因特網(wǎng)的網(wǎng)絡(luò)層通過源和目的地之間的一系列路由器路由數(shù)據(jù)報。
? 物理層:在物理層上所傳數(shù)據(jù)的單位是比特。物理層的任務(wù)就是透明地傳送比特流。
這些層對于初學(xué)者來說很難理解,我們只需要知道:我們需要使用“運輸層”編寫應(yīng)用程序,我們的應(yīng)用程序位于“應(yīng)用層”。使用“運輸層”時,可以選擇 TCP 協(xié)議,也可以選擇 UDP 協(xié)議。

1、TCP 和 和 UDP區(qū)別

TCP 向它的應(yīng)用程序提供了面向連接的服務(wù)。這種服務(wù)有 2 個特點:可靠傳輸、流量控制(即發(fā)送方/接收方速率匹配)。它包括了應(yīng)用層報文劃分為短報文,并提供擁塞控制機制。
UDP 協(xié)議向它的應(yīng)用程序提供無連接服務(wù)。它沒有可靠性,沒有流量控制,也沒有擁塞控制。
在這里插入圖片描述

既然 TCP 提供了可靠數(shù)據(jù)傳輸服務(wù),而 UDP 不能提供,那么 TCP 是否總是首選呢?

答案是否定的,因為有許多應(yīng)用更適合用 UDP,舉個例子:視頻通話時,使用 UDP,偶爾的丟包、偶爾的花屏?xí)r可以忍受的;如果使用 TCP,每個數(shù)據(jù)包都要確??煽總鬏?#xff0c;當(dāng)它出錯時就重傳,這會導(dǎo)致后續(xù)的數(shù)據(jù)包被阻滯,視頻效果反而不好。使用 UDP 時,有如下特點:
① 關(guān)于何時發(fā)送什么數(shù)據(jù)控制的更為精細(xì)
采用 UDP 時只要應(yīng)用進程將數(shù)據(jù)傳遞給 UDP,UDP 就會立即將其傳遞給網(wǎng)絡(luò)層。而 TCP 有重傳機制,而不管可靠交付需要多長時間。但是實時應(yīng)用通常不希望過分的延遲報文段的傳送,且能容忍一部分?jǐn)?shù)據(jù)丟失。
② 無需建立連接,不會引入建立連接時的延遲。
③ 無連接狀態(tài),能支持更多的活躍客戶。
④ 分組首部開銷較小。

2、TCP工作流程圖

在這里插入圖片描述

3、UDP工作流程圖

在這里插入圖片描述

http://aloenet.com.cn/news/32851.html

相關(guān)文章:

  • 合肥疫情風(fēng)險等級思億歐seo靠譜嗎
  • 天津企業(yè)網(wǎng)站建站做一個公司網(wǎng)站大概要多少錢
  • 用自己電腦做網(wǎng)站的空間百度自媒體注冊入口
  • 南寧seo費用服務(wù)短視頻seo系統(tǒng)
  • 黨政機關(guān)如何建設(shè)網(wǎng)站企業(yè)推廣網(wǎng)絡(luò)營銷外包服務(wù)
  • 做網(wǎng)站如何與美工配合日本比分預(yù)測
  • 網(wǎng)站開發(fā)速成班網(wǎng)絡(luò)軟文怎么寫
  • 天津建設(shè)工程信息網(wǎng) 官網(wǎng)首頁seo排名點擊器曝光行者seo
  • 鄂州做網(wǎng)站公司推廣營銷軟件app
  • 建設(shè)銀行梅州分行網(wǎng)站廈門seo怎么做
  • 武漢 網(wǎng)站制作案例北京建站
  • 平頂山網(wǎng)站建設(shè)費用競價排名是什么
  • 網(wǎng)站建設(shè)流程有東莞網(wǎng)站推廣方案
  • 成都模板網(wǎng)站建設(shè)網(wǎng)絡(luò)推廣優(yōu)化平臺
  • 下沙開發(fā)區(qū)建設(shè)局網(wǎng)站廣州軟文推廣公司
  • 威海做網(wǎng)站多少錢百度助手app下載
  • 網(wǎng)站建設(shè)計劃網(wǎng)絡(luò)營銷有什么崗位
  • 做網(wǎng)站論文網(wǎng)絡(luò)營銷的模式有哪些?
  • 做二手車網(wǎng)站怎么做的外貿(mào)軟件排行榜
  • 網(wǎng)站建設(shè)倒計時模板推廣引流圖片
  • 網(wǎng)站開發(fā)使用哪種語言免費網(wǎng)站站長查詢
  • 個人做網(wǎng)站如何賺錢嗎百度客服電話人工服務(wù)熱線電話
  • 北京市網(wǎng)站建設(shè)百度搜索推廣怎么做
  • 青島開發(fā)區(qū)網(wǎng)站建設(shè)公司汽車seo是什么意思
  • 網(wǎng)站建設(shè)與網(wǎng)頁設(shè)計如何優(yōu)化百度seo排名
  • 魚滑怎么制作教程搜索引擎優(yōu)化seo的英文全稱是
  • 施工效果圖怎么做關(guān)鍵詞搜索優(yōu)化
  • 江蘇做網(wǎng)站公司東莞整站優(yōu)化推廣公司找火速
  • 個人電腦做網(wǎng)站服務(wù)器教程制作一個app軟件需要多少錢
  • 利辛做網(wǎng)站搜索引擎關(guān)鍵詞怎么選