自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

OpenHarmony與蘋(píng)果的夢(mèng)幻聯(lián)動(dòng)——服務(wù)器端(上)

系統(tǒng) OpenHarmony
本篇文章將詳細(xì)介紹如何在小熊派搭建TCP服務(wù)器,處理來(lái)自各種客戶端的請(qǐng)求。本篇文章適合于小型系統(tǒng)和標(biāo)準(zhǔn)系統(tǒng),大家可以將本項(xiàng)目移植到符合以上條件的開(kāi)發(fā)板上。配置好對(duì)應(yīng)的編譯規(guī)則即可。

??想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??51CTO OpenHarmony技術(shù)社區(qū)??

??https://ost.51cto.com??

一、前言

承接上篇文章的??項(xiàng)目介紹??,本篇文章將詳細(xì)介紹如何在小熊派搭建TCP服務(wù)器,處理來(lái)自各種客戶端的請(qǐng)求。本篇文章適合于小型系統(tǒng)和標(biāo)準(zhǔn)系統(tǒng),大家可以將本項(xiàng)目移植到符合以上條件的開(kāi)發(fā)板上。配置好對(duì)應(yīng)的編譯規(guī)則即可。

二、準(zhǔn)備工作

1、小熊派-鴻蒙·叔(BearPi-HM Micro)一臺(tái)。

2、已經(jīng)配置好小熊派開(kāi)發(fā)環(huán)境的電腦一臺(tái)。

3、將小熊派接入到局域網(wǎng)。

三、流程簡(jiǎn)介

編寫(xiě)TCP服務(wù)器的C文件 --> 配置BUILD.gn --> 將我們的代碼添加編譯–>編譯燒錄。

四、網(wǎng)絡(luò)開(kāi)發(fā)基礎(chǔ)知識(shí)

在OpenHarmony上進(jìn)行網(wǎng)絡(luò)開(kāi)發(fā)與在Linux上進(jìn)行網(wǎng)絡(luò)開(kāi)發(fā)十分相似,采用的是C語(yǔ)言的套接字(Socket)開(kāi)發(fā)。

進(jìn)行網(wǎng)絡(luò)開(kāi)發(fā)之前,如果沒(méi)有相關(guān)基礎(chǔ),建議先了解一下OSI網(wǎng)絡(luò)模型與TCP/IP協(xié)議的關(guān)系。本次用到的是用Socket進(jìn)行傳輸層的開(kāi)發(fā),使用了到了一點(diǎn)點(diǎn)應(yīng)用層HTTP的協(xié)議。

(1) 什么是Socket

在計(jì)算機(jī)通信領(lǐng)域,socket 被翻譯為“套接字”,它是計(jì)算機(jī)之間進(jìn)行通信的一種約定或一種方式。通過(guò) socket 這種約定,一臺(tái)計(jì)算機(jī)可以接收其他計(jì)算機(jī)的數(shù)據(jù),也可以向其他計(jì)算機(jī)發(fā)送數(shù)據(jù)。

總結(jié)為一句就是:socket就是整合好TCP/IP協(xié)議的一個(gè)工具。讓我們無(wú)需過(guò)度關(guān)注于底層協(xié)議的實(shí)現(xiàn),直接用封裝好的socket就行了。

(2) TCP通信流程

在開(kāi)始使用socket之前,我們要知道TCP服務(wù)器端與TCP客戶端進(jìn)行通信的流程。

我們小熊派要實(shí)現(xiàn)的是圖中的9右半部分,即TCP服務(wù)器端。我們一步一步的看,每一步都有對(duì)應(yīng)的代碼來(lái)實(shí)現(xiàn)。

第一步:socket()函數(shù)用來(lái)創(chuàng)建socket套接字,可以理解為面對(duì)對(duì)象中的創(chuàng)建對(duì)象,但是不等同。

第二步:bind()函數(shù)用來(lái)綁定IP和端口,即選擇你的TCP服務(wù)器在哪個(gè)IP和端口提供服務(wù)。

第三步:listen()函數(shù)用來(lái)監(jiān)聽(tīng)上一步中選擇的IP和端口。

第四步:accept()函數(shù)用來(lái)等待來(lái)自客戶端的連接,即進(jìn)入阻塞狀態(tài)。

第五步:read()函數(shù)會(huì)在有客戶請(qǐng)求時(shí),讀取客戶端發(fā)送的請(qǐng)求數(shù)據(jù)。

第六步:write()函數(shù)可以給客戶端返回?cái)?shù)據(jù),該操作可選,也可以不給客戶端返回任何數(shù)據(jù)。

第七步:read()和write()操作可以一直反復(fù)執(zhí)行,即互相不斷通信,當(dāng)通信完成時(shí),執(zhí)行close函數(shù)關(guān)閉套接字。

(3) 相關(guān)函數(shù)講解

創(chuàng)建socket套接字

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

參數(shù)介紹

  • domain:協(xié)議域,又稱(chēng)協(xié)議族(family),常用的協(xié)議族有 AFL INET、AF INET6、AF LOCAL(或稱(chēng)AF UNIX, Unix成socket) AF ROUTE 等。協(xié)議族決定了 socket 的地址類(lèi)型,在通信中必須采用對(duì)應(yīng)的地址,如AF INET 決定了要用 ipv4 地址 。 (32位的》與端口號(hào)(16位的)的組合,AF UNIX 決定了要用一個(gè)絕對(duì)路徑名作為地址。
  • type:指定 Socket 類(lèi)型。常用的 socket 類(lèi)型有 SOCK STREAM、SOCK DGRAM、SOCK RAW 、SOCK PACKET、 SOCK SEQPACKET 等。流式 socket (SOCK STREAM)是一種面向連接的 Socket, 針對(duì)于面向連接的 TCP 。 服務(wù)應(yīng)用。數(shù)據(jù)報(bào)式 socket(SOCK DGRAM) 是一種無(wú)連接的 Socket,對(duì)應(yīng)于 無(wú)連接的 UDP 服務(wù)應(yīng)用。
  • protocol: 指定協(xié)議。常用協(xié)議有 IPPROTO TCP、IPPROTO UDP、IPPROTO STCP、IPPROTO TIPC 等,分別對(duì)應(yīng)TCP 傳輸協(xié)議,UDP 傳輸協(xié)議、STCP 傳輸協(xié)議、TIPC 傳輸協(xié)議。參數(shù)為o時(shí),會(huì)自動(dòng)選擇第二個(gè)參數(shù)類(lèi)型對(duì)應(yīng)的默認(rèn)協(xié)議。

注意:type 和protocol 不可以隨意組合,如SOCK STREAM 不可以跟 1PPROTOUDP 組合。

返回值: 如果調(diào)用成功就返口新創(chuàng)建的套接字的描述符,如果大敗就返回INVALID SOCKET(Linux 下失敗返回-1)。

綁定端口函數(shù)

int bind(int socketfd,const struct sockaddr *addr,socklen_t addrlen)

參數(shù)介紹

  • socketfd:—個(gè)標(biāo)識(shí)己連接套接口的描述字。
  • address:是個(gè)sockaddr結(jié)構(gòu)指針,該結(jié)構(gòu)中包含了要結(jié)合的地址和端口號(hào)。
  • address_len:確定 address 緩沖區(qū)的長(zhǎng)度。

注意:其中 sockaddr這個(gè)地址結(jié)構(gòu)根據(jù)地址創(chuàng)建 socket 時(shí)的地址協(xié)議族的不同而不同。

返回值:如果函數(shù)執(zhí)行成功,返回值為0,否則為SOCKET_ERROR。

開(kāi)始監(jiān)聽(tīng)函數(shù)

int listen(int socketfd,int backlog)

參數(shù)介紹

  • socketfd:要監(jiān)聽(tīng)的socket描述字。
  • backlog:相應(yīng)socket可以排隊(duì)的最大連接個(gè)數(shù)。

等待連接阻塞函數(shù)

int accept(int socketfd,struct sockaddr *addr, socklen_t *addrlen);

參數(shù)介紹

  • socketfd:就是上面解釋中的監(jiān)聽(tīng)套接字,這個(gè)套接字用來(lái)監(jiān)聽(tīng)一個(gè)端口,當(dāng)有一個(gè)客戶與服務(wù)器連接時(shí),它使用這個(gè)個(gè)端口號(hào),而此時(shí)這個(gè)端口號(hào)正與這個(gè)套接字關(guān)聯(lián)。當(dāng)然客戶不知道套接字這些細(xì)節(jié),已只知道一個(gè)地址和一個(gè)端口號(hào)。
  • sockaddr:結(jié)果參數(shù),它用來(lái)接受一個(gè)返回值,這返回值指定客戶端的地址,當(dāng)然這個(gè)地址是通過(guò)某個(gè)地址結(jié)構(gòu)來(lái)描述的,用戶應(yīng)該知道這一個(gè)什么樣的地址結(jié)構(gòu)。如果對(duì)客戶的地址不感興趣,那么可以把這個(gè)值設(shè)置為NULL。
  • len:它也是結(jié)果的參數(shù),用來(lái)接受上述 addr 的結(jié)構(gòu)的大小的,已指明 addr 結(jié)構(gòu)所占有的宇節(jié)個(gè)數(shù)。同樣的,它也可以被設(shè)置為NULL。

注意:accept默認(rèn)會(huì)阻塞進(jìn)程,直到有一個(gè)客戶連接建立后返回,它返回的是一個(gè)新可用的套接字,這個(gè)套接字是連接套接字。

返回值:成功返回客戶端的文件貓述符,失敗返回-1。一如果accept成功返回,則服務(wù)器與容戶

己經(jīng)正確建立連接了,此時(shí)服務(wù)器通過(guò)accept返口的套接字來(lái)完成與客戶的通信。

五、連接函數(shù)

int connnect(int sockfd,const struct sockaddr *addr,socklen_t addrlen)

參數(shù)介紹

  • socketfd:客戶端socket的描述字。
  • socketaddr:服務(wù)器的socket地址。
  • addrlen:socket地址的長(zhǎng)度

發(fā)送函數(shù)

發(fā)送函數(shù)有兩個(gè):

ssize_t write(int sockfd,const void *buf,szie_t nbytes);

參數(shù)介紹

  • sockfd為要寫(xiě)入文件的描述符。
  • buf為要寫(xiě)入數(shù)據(jù)的緩沖區(qū)地址。
  • nbytes為要寫(xiě)入的數(shù)據(jù)的字節(jié)書(shū)。

返回值:成功返回寫(xiě)入的字節(jié)數(shù),失敗返回-1。

int send(int sockfd,const void *buf,int len,int flags)

參數(shù)介紹

  • sockfd為要寫(xiě)入文件的描述符。
  • buf為要寫(xiě)入數(shù)據(jù)的緩沖區(qū)地址。
  • len為要寫(xiě)入的數(shù)據(jù)的字節(jié)書(shū)。
  • flags有以下選擇,MSG_ DONTROUTE 為不查找路由表;MSG_OOB為接受或發(fā)送帶外數(shù)據(jù) ;MSG PEEK為查看數(shù)據(jù),且不從系統(tǒng)緩沖區(qū)移走數(shù)據(jù);MSG WAITALL為等待任何數(shù)據(jù);0和write函數(shù)的操作一樣。

返回值:成功返回寫(xiě)入的字節(jié)數(shù),失敗返回-1。

接受函數(shù)

接受函數(shù)同樣有兩個(gè):

ssize_t read(int sockfd,const void *buf,szie_t nbytes);

參數(shù)介紹

  • sockfd為要讀取文件的描述符。
  • buf為要讀取數(shù)據(jù)的緩沖區(qū)地址。
  • nbytes為要讀取的數(shù)據(jù)的字節(jié)書(shū)。

返回值:成功返回讀取到的字節(jié)數(shù),失敗返回-1。

int recv(int sockfd,const void *buf,int len,int flags)

參數(shù)介紹

  • sockfd為要寫(xiě)入文件的描述符。
  • buf為要寫(xiě)入數(shù)據(jù)的緩沖區(qū)地址。
  • len為要寫(xiě)入的數(shù)據(jù)的字節(jié)書(shū)。
  • flags有以下選擇,MSG_ DONTROUTE 為不查找路由表;MSG_OOB為接受或發(fā)送帶外數(shù)據(jù) ;MSG PEEK為查看數(shù)據(jù),且不從系統(tǒng)緩沖區(qū)移走數(shù)據(jù);MSG WAITALL為等待任何數(shù)據(jù);0和write函數(shù)的操作一樣。

返回值:成功返回寫(xiě)入的字節(jié)數(shù),失敗返回-1。

??想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):??

??51CTO OpenHarmony技術(shù)社區(qū)??

??https://ost.51cto.com??

責(zé)任編輯:jianghua 來(lái)源: 鴻蒙社區(qū)
相關(guān)推薦

2022-05-07 15:54:56

小熊派鴻蒙

2011-06-07 16:01:46

Android 服務(wù)器 數(shù)據(jù)交互

2013-12-25 11:01:16

JavaScript

2014-01-15 10:06:30

vFlash

2024-02-22 13:47:40

2012-10-15 13:40:15

IBMdw

2010-08-06 15:35:06

Flex服務(wù)器

2009-06-10 16:25:02

2021-09-02 10:49:25

Node.jsPHP服務(wù)器開(kāi)發(fā)

2010-08-27 10:23:26

DHCP服務(wù)器

2017-12-06 22:29:53

2015-11-04 14:14:56

HTTP網(wǎng)絡(luò)協(xié)議

2014-11-14 11:03:56

微軟.NET

2023-06-30 08:00:00

漏洞網(wǎng)絡(luò)安全SSTI

2009-07-06 17:22:54

JSP服務(wù)器

2021-07-27 06:14:32

服務(wù)器端移動(dòng)端性能測(cè)試

2009-07-27 12:56:27

控件CheckBoxLASP.NET服務(wù)器

2009-10-20 17:28:02

VB.NET服務(wù)器端

2010-10-15 08:57:15

PHP多進(jìn)程

2012-05-21 10:52:43

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)