国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

socket | 網(wǎng)絡(luò)套接字、網(wǎng)絡(luò)字節(jié)序、sockaddr結(jié)構(gòu)

這篇具有很好參考價(jià)值的文章主要介紹了socket | 網(wǎng)絡(luò)套接字、網(wǎng)絡(luò)字節(jié)序、sockaddr結(jié)構(gòu)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

socket | 網(wǎng)絡(luò)套接字、網(wǎng)絡(luò)字節(jié)序、sockaddr結(jié)構(gòu)

歡迎關(guān)注博主 Mindtechnist 或加入【Linux C/C++/Python社區(qū)】一起學(xué)習(xí)和分享Linux、C、C++、Python、Matlab,機(jī)器人運(yùn)動控制、多機(jī)器人協(xié)作,智能優(yōu)化算法,濾波估計(jì)、多傳感器信息融合,機(jī)器學(xué)習(xí),人工智能等相關(guān)領(lǐng)域的知識和技術(shù)。



專欄:《網(wǎng)絡(luò)編程》


套接字概念

Socket本身有“插座”的意思,在Linux環(huán)境下,用于表示進(jìn)程間網(wǎng)絡(luò)通信的特殊文件類型。本質(zhì)為內(nèi)核借助緩沖區(qū)形成的偽文件。
既然是文件,那么理所當(dāng)然的,我們可以使用文件描述符引用套接字。與管道類似的,Linux系統(tǒng)將其封裝成文件的目的是為了統(tǒng)一接口,使得讀寫套接字和讀寫文件的操作一致。區(qū)別是管道主要應(yīng)用于本地進(jìn)程間通信,而套接字多應(yīng)用于網(wǎng)絡(luò)進(jìn)程間數(shù)據(jù)的傳遞。
套接字的內(nèi)核實(shí)現(xiàn)較為復(fù)雜,不宜在學(xué)習(xí)初期深入學(xué)習(xí)。
在TCP/IP協(xié)議中,“IP地址+TCP或UDP端口號”唯一標(biāo)識網(wǎng)絡(luò)通訊中的一個(gè)進(jìn)程?!癐P地址+端口號”就對應(yīng)一個(gè)socket。欲建立連接的兩個(gè)進(jìn)程各自有一個(gè)socket來標(biāo)識,那么這兩個(gè)socket組成的socket pair就唯一標(biāo)識一個(gè)連接。因此可以用Socket來描述網(wǎng)絡(luò)連接的一對一關(guān)系。
套接字通信原理如下圖所示:
socket | 網(wǎng)絡(luò)套接字、網(wǎng)絡(luò)字節(jié)序、sockaddr結(jié)構(gòu)
在網(wǎng)絡(luò)通信中,套接字一定是成對出現(xiàn)的。一端的發(fā)送緩沖區(qū)對應(yīng)對端的接收緩沖區(qū)。我們使用同一個(gè)文件描述符索發(fā)送緩沖區(qū)和接收緩沖區(qū)。
TCP/IP協(xié)議最早在BSD UNIX上實(shí)現(xiàn),為TCP/IP協(xié)議設(shè)計(jì)的應(yīng)用層編程接口稱為socket API。本章的主要內(nèi)容是socket API,主要介紹TCP協(xié)議的函數(shù)接口,最后介紹UDP協(xié)議和UNIX Domain Socket的函數(shù)接口。
socket | 網(wǎng)絡(luò)套接字、網(wǎng)絡(luò)字節(jié)序、sockaddr結(jié)構(gòu)

網(wǎng)絡(luò)字節(jié)序

我們已經(jīng)知道,內(nèi)存中的多字節(jié)數(shù)據(jù)相對于內(nèi)存地址有大端和小端之分,磁盤文件中的多字節(jié)數(shù)據(jù)相對于文件中的偏移地址也有大端小端之分。網(wǎng)絡(luò)數(shù)據(jù)流同樣有大端小端之分,那么如何定義網(wǎng)絡(luò)數(shù)據(jù)流的地址呢?發(fā)送主機(jī)通常將發(fā)送緩沖區(qū)中的數(shù)據(jù)按內(nèi)存地址從低到高的順序發(fā)出,接收主機(jī)把從網(wǎng)絡(luò)上接到的字節(jié)依次保存在接收緩沖區(qū)中,也是按內(nèi)存地址從低到高的順序保存,因此,網(wǎng)絡(luò)數(shù)據(jù)流的地址應(yīng)這樣規(guī)定:先發(fā)出的數(shù)據(jù)是低地址,后發(fā)出的數(shù)據(jù)是高地址。
TCP/IP協(xié)議規(guī)定,網(wǎng)絡(luò)數(shù)據(jù)流應(yīng)采用大端字節(jié)序,即低地址高字節(jié)。例如上一節(jié)的UDP段格式,地址0-1是16位的源端口號,如果這個(gè)端口號是1000(0x3e8),則地址0是0x03,地址1是0xe8,也就是先發(fā)0x03,再發(fā)0xe8,這16位在發(fā)送主機(jī)的緩沖區(qū)中也應(yīng)該是低地址存0x03,高地址存0xe8。但是,如果發(fā)送主機(jī)是小端字節(jié)序的,這16位被解釋成0xe803,而不是1000。因此,發(fā)送主機(jī)把1000填到發(fā)送緩沖區(qū)之前需要做字節(jié)序的轉(zhuǎn)換。同樣地,接收主機(jī)如果是小端字節(jié)序的,接到16位的源端口號也要做字節(jié)序的轉(zhuǎn)換。如果主機(jī)是大端字節(jié)序的,發(fā)送和接收都不需要做轉(zhuǎn)換。同理,32位的IP地址也要考慮網(wǎng)絡(luò)字節(jié)序和主機(jī)字節(jié)序的問題。
為使網(wǎng)絡(luò)程序具有可移植性,使同樣的C代碼在大端和小端計(jì)算機(jī)上編譯后都能正常運(yùn)行,可以調(diào)用以下庫函數(shù)做網(wǎng)絡(luò)字節(jié)序和主機(jī)字節(jié)序的轉(zhuǎn)換。

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

h表示host,n表示network,l表示32位長整數(shù),s表示16位短整數(shù)。
如果主機(jī)是小端字節(jié)序,這些函數(shù)將參數(shù)做相應(yīng)的大小端轉(zhuǎn)換然后返回,如果主機(jī)是大端字節(jié)序,這些函數(shù)不做轉(zhuǎn)換,將參數(shù)原封不動地返回。

IP地址轉(zhuǎn)換函數(shù)

早期:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
char *inet_ntoa(struct in_addr in);

只能處理IPv4的ip地址
注意參數(shù)是struct in_addr
現(xiàn)在:

#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

支持IPv4和IPv6
其中inet_pton和inet_ntop不僅可以轉(zhuǎn)換IPv4的in_addr,還可以轉(zhuǎn)換IPv6的in6_addr。
因此函數(shù)接口是void *addrptr。
sockaddr數(shù)據(jù)結(jié)構(gòu)
strcut sockaddr 很多網(wǎng)絡(luò)編程函數(shù)誕生早于IPv4協(xié)議,那時(shí)候都使用的是sockaddr結(jié)構(gòu)體,為了向前兼容,現(xiàn)在sockaddr退化成了(void *)的作用,傳遞一個(gè)地址給函數(shù),至于這個(gè)函數(shù)是sockaddr_in還是sockaddr_in6,由地址族確定,然后函數(shù)內(nèi)部再強(qiáng)制類型轉(zhuǎn)化為所需的地址類型。

sockaddr數(shù)據(jù)結(jié)構(gòu)

struct sockaddr {
	sa_family_t sa_family; 		/* address family, AF_xxx */
	char sa_data[14];			/* 14 bytes of protocol address */
};

使用 sudo grep -r “struct sockaddr_in {” /usr 命令可查看到struct sockaddr_in結(jié)構(gòu)體的定義。一般其默認(rèn)的存儲位置:/usr/include/linux/in.h 文件中。

struct sockaddr_in {
	__kernel_sa_family_t sin_family; 			/* Address family */  	地址結(jié)構(gòu)類型
	__be16 sin_port;					 		/* Port number */		端口號
	struct in_addr sin_addr;					/* Internet address */	IP地址
	/* Pad to size of `struct sockaddr'. */
	unsigned char __pad[__SOCK_SIZE__ - sizeof(short int) -
	sizeof(unsigned short int) - sizeof(struct in_addr)];
};

struct in_addr {						/* Internet address. */
	__be32 s_addr;
};

struct sockaddr_in6 {
	unsigned short int sin6_family; 		/* AF_INET6 */
	__be16 sin6_port; 					/* Transport layer port # */
	__be32 sin6_flowinfo; 				/* IPv6 flow information */
	struct in6_addr sin6_addr;			/* IPv6 address */
	__u32 sin6_scope_id; 				/* scope id (new in RFC2553) */
};

struct in6_addr {
	union {
		__u8 u6_addr8[16];
		__be16 u6_addr16[8];
		__be32 u6_addr32[4];
	} in6_u;
	#define s6_addr 		in6_u.u6_addr8
	#define s6_addr16 	in6_u.u6_addr16
	#define s6_addr32	 	in6_u.u6_addr32
};

#define UNIX_PATH_MAX 108
	struct sockaddr_un {
	__kernel_sa_family_t sun_family; 	/* AF_UNIX */
	char sun_path[UNIX_PATH_MAX]; 	/* pathname */
};

IPv4和IPv6的地址格式定義在netinet/in.h中,IPv4地址用sockaddr_in結(jié)構(gòu)體表示,包括16位端口號和32位IP地址,IPv6地址用sockaddr_in6結(jié)構(gòu)體表示,包括16位端口號、128位IP地址和一些控制字段。UNIX Domain Socket的地址格式定義在sys/un.h中,用sock-addr_un結(jié)構(gòu)體表示。各種socket地址結(jié)構(gòu)體的開頭都是相同的,前16位表示整個(gè)結(jié)構(gòu)體的長度(并不是所有UNIX的實(shí)現(xiàn)都有長度字段,如Linux就沒有),后16位表示地址類型。IPv4、IPv6和Unix Domain Socket的地址類型分別定義為常數(shù)AF_INET、AF_INET6、AF_UNIX。這樣,只要取得某種sockaddr結(jié)構(gòu)體的首地址,不需要知道具體是哪種類型的sockaddr結(jié)構(gòu)體,就可以根據(jù)地址類型字段確定結(jié)構(gòu)體中的內(nèi)容。因此,socket API可以接受各種類型的sockaddr結(jié)構(gòu)體指針做參數(shù),例如bind、accept、connect等函數(shù),這些函數(shù)的參數(shù)應(yīng)該設(shè)計(jì)成void *類型以便接受各種類型的指針,但是sock API的實(shí)現(xiàn)早于ANSI C標(biāo)準(zhǔn)化,那時(shí)還沒有void *類型,因此這些函數(shù)的參數(shù)都用struct sockaddr *類型表示,在傳遞參數(shù)之前要強(qiáng)制類型轉(zhuǎn)換一下,例如:

struct sockaddr_in servaddr;
bind(listen_fd, (struct sockaddr *)&servaddr, sizeof(servaddr));		/* initialize servaddr */

socket | 網(wǎng)絡(luò)套接字、網(wǎng)絡(luò)字節(jié)序、sockaddr結(jié)構(gòu)
socket | 網(wǎng)絡(luò)套接字、網(wǎng)絡(luò)字節(jié)序、sockaddr結(jié)構(gòu)文章來源地址http://www.zghlxwxcb.cn/news/detail-454472.html


到了這里,關(guān)于socket | 網(wǎng)絡(luò)套接字、網(wǎng)絡(luò)字節(jié)序、sockaddr結(jié)構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 網(wǎng)絡(luò)編程套接字(Socket)

    網(wǎng)絡(luò)編程套接字(Socket)

    認(rèn)識IP地址, 端口號, 網(wǎng)絡(luò)字節(jié)序等網(wǎng)絡(luò)編程中的基本概念; 學(xué)習(xí)socket api的基本用法; 能夠?qū)崿F(xiàn)一個(gè)簡單的udp客戶端/服務(wù)器; 能夠?qū)崿F(xiàn)一個(gè)簡單的tcp客戶端/服務(wù)器(單連接版本, 多進(jìn)程版本, 多線程版本); 理解tcp服務(wù)器建立連接, 發(fā)送數(shù)據(jù), 斷開連接的流程; 通俗易懂地說,源

    2024年01月21日
    瀏覽(106)
  • 【網(wǎng)絡(luò)協(xié)議】聊聊套接字socket

    【網(wǎng)絡(luò)協(xié)議】聊聊套接字socket

    網(wǎng)絡(luò)編程我們知道是通過socket進(jìn)行編程的,其實(shí)socket也是基于TCP和UDP協(xié)議進(jìn)行編程的。但是在socket層面是感知不到下層的,所以在設(shè)置參數(shù)的時(shí)候,其實(shí)是端到端協(xié)議智商的網(wǎng)絡(luò)層和傳輸層。TCP是數(shù)據(jù)流所以設(shè)置為SOCK_STREAM,而UDP是基于數(shù)據(jù)報(bào)的,設(shè)置為SOCK_DGRAM 整體流程其實(shí)

    2024年02月07日
    瀏覽(27)
  • 【計(jì)算機(jī)網(wǎng)絡(luò)】socket 網(wǎng)絡(luò)套接字

    【計(jì)算機(jī)網(wǎng)絡(luò)】socket 網(wǎng)絡(luò)套接字

    實(shí)際上我們兩臺機(jī)器在進(jìn)行通信時(shí),是應(yīng)用層在進(jìn)行通信,應(yīng)用層必定會推動下層和對方的上層進(jìn)行通信。 其實(shí)網(wǎng)絡(luò)協(xié)議棧中的下三層,主要解決的是數(shù)據(jù)安全可靠的送到遠(yuǎn)端機(jī)器。而用戶使用應(yīng)用層軟件,完成數(shù)據(jù)發(fā)送和接收的。那么用戶要使用軟件,首先需要把這個(gè)軟件

    2024年02月22日
    瀏覽(31)
  • 網(wǎng)絡(luò)編程—Socket套接字詳解

    網(wǎng)絡(luò)編程—Socket套接字詳解

    目錄 一、網(wǎng)絡(luò)編程 1.1、為什么需要網(wǎng)絡(luò)編程? 1.2、什么是網(wǎng)絡(luò)編程 1.3、發(fā)送端和接收端 ?編輯1.4、請求和響應(yīng) ?編輯1.5、客戶端和服務(wù)端? 二、Socket套接字? 2.1、概念 2.2、分類? 2.2.1、流套接字? 2.2.2、數(shù)據(jù)報(bào)套接字? 2.2.3、原始套接字? 2.3、Socket編程注意事項(xiàng)? 1.1、為什

    2024年02月16日
    瀏覽(101)
  • 【網(wǎng)絡(luò)】socket套接字基礎(chǔ)知識

    【網(wǎng)絡(luò)】socket套接字基礎(chǔ)知識

    IP 每臺主機(jī)都有自己的IP地址,所以當(dāng)數(shù)據(jù)從一臺主機(jī)傳輸?shù)搅硪慌_主機(jī)就需要IP地址。報(bào)頭中就會包含源IP和目的IP 源IP地址:發(fā)送數(shù)據(jù)報(bào)那個(gè)主機(jī)的IP地址,目的IP地址:想發(fā)送到的那個(gè)主機(jī)的IP地址 我們把數(shù)據(jù)從一臺主機(jī)傳遞到另一臺主機(jī)不是真正目的,真正通信的不是這

    2024年02月03日
    瀏覽(31)
  • 網(wǎng)絡(luò)編程之 Socket 套接字(使用數(shù)據(jù)報(bào)套接字和流套接字分別實(shí)現(xiàn)一個(gè)小程序(附源碼))

    網(wǎng)絡(luò)編程之 Socket 套接字(使用數(shù)據(jù)報(bào)套接字和流套接字分別實(shí)現(xiàn)一個(gè)小程序(附源碼))

    網(wǎng)絡(luò)編程是指網(wǎng)絡(luò)上的主機(jī),通過不同的進(jìn)程,以編程的方式實(shí)現(xiàn) 網(wǎng)絡(luò)通信(或稱為網(wǎng)絡(luò)數(shù)據(jù)傳輸) 只要滿足不同的進(jìn)程就可以進(jìn)行通信,所以即便是在同一個(gè)主機(jī),只要不同的進(jìn)程,基于網(wǎng)絡(luò)傳輸數(shù)據(jù),也屬于網(wǎng)絡(luò)編程 在一次網(wǎng)絡(luò)傳輸中: 發(fā)送端: 數(shù)據(jù)的 發(fā)送方進(jìn)程

    2024年02月03日
    瀏覽(85)
  • [JAVAee]網(wǎng)絡(luò)編程-套接字Socket

    [JAVAee]網(wǎng)絡(luò)編程-套接字Socket

    目錄 基本概念 發(fā)送端與接收端 請求與響應(yīng) ?編輯客戶端與服務(wù)器 Socket套接字? 分類 數(shù)據(jù)報(bào)套接字 流套接字傳輸模型?? UDP數(shù)據(jù)報(bào)套接字編程 DatagramSocket API DatagramPacket API InetSocketAddress API 示例一: 示例二: TCP流數(shù)據(jù)報(bào)套接字編程 ServerSocket API Socket API 示例一: ? 網(wǎng)絡(luò)編程指的

    2024年02月13日
    瀏覽(126)
  • 網(wǎng)絡(luò)之socket套接字-基礎(chǔ)知識

    本文介紹了網(wǎng)絡(luò)的一些基礎(chǔ)概念,主要包括:IP和端口號、TCP/UDP協(xié)議、網(wǎng)絡(luò)字節(jié)流以及套接字接口。 每臺主機(jī)都有自己的IP地址,所以當(dāng)數(shù)據(jù)從一臺主機(jī)傳輸?shù)搅硪慌_主機(jī),就需要IP地址。報(bào)頭中會包含源IP和目的IP。 源IP地址 :發(fā)送數(shù)據(jù)包的那個(gè)主機(jī)的IP地址。 目的IP地址

    2024年02月10日
    瀏覽(49)
  • 【網(wǎng)絡(luò)通信】socket編程——TCP套接字

    【網(wǎng)絡(luò)通信】socket編程——TCP套接字

    TCP依舊使用代碼來熟悉對應(yīng)的套接字,很多接口都是在udp中使用過的 所以就不會單獨(dú)把他們拿出來作為標(biāo)題了,只會把第一次出現(xiàn)的接口作為標(biāo)題 通過TCP的套接字 ,來把數(shù)據(jù)交付給對方的應(yīng)用層,完成雙方進(jìn)程的通信 在 tcpServer.hpp 中,創(chuàng)建一個(gè)命名空間 yzq 用于封裝 在命名

    2024年02月13日
    瀏覽(102)
  • muduo網(wǎng)絡(luò)庫剖析——套接字Socket類

    muduo網(wǎng)絡(luò)庫剖析——套接字Socket類

    作為一個(gè)宏大的、功能健全的muduo庫,考慮的肯定是眾多情況是否可以高效滿足;而作為學(xué)習(xí)者,我們需要抽取其中的精華進(jìn)行簡要實(shí)現(xiàn),這要求我們足夠了解muduo庫。 做項(xiàng)目 = 模仿 + 修改,不要擔(dān)心自己學(xué)了也不會寫怎么辦,重要的是積累,學(xué)到了這些方法,如果下次在遇

    2024年01月19日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包