女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Socket采用C/S模型進行設計的服務器模型

Q4MP_gh_c472c21 ? 來源:未知 ? 作者:李倩 ? 2018-03-24 11:20 ? 次閱讀

Socket的中文翻譯為“插座”,在計算機世界里稱為套接字。Socket最初是作為網絡上不同主機之間進程的通信接口,后來應用越來越廣,在同一主機上的不同進程之間通信也可以用Socket。簡單來說,當網絡上不同主機之間的兩個進程(A、B)采用Socket進行通信時,那么它們之間需要建立一個通信端點,即創建Socket,創建Socket時就分配端口號和網絡地址。當進程A向進程B發送數據時,那么進程A必須要知道進程B的網絡地址及端口號。

Socket采用C/S模型進行設計的,即Client/Server,面向客戶端—服務器模型。

每一個Socket都用一個半相關描述:

{協議,本地地址,本地端口}

一個完整的Socket則用一個相關描述:

{協議,本地地址,本地端口,遠程地址,遠程端口}

一、Socket的類型

Socket有三種類型:

1、字節流套接字(SOCK_STREAM)

字節流的套接字可以提供可靠的數據傳輸、面向連接的通訊流。數據按何種順序發送,就按何種順序接收。例如,當我們按順序發送A-B-C,那么在數據到達接收端時,它的順序也是A-B-C。字節流套接字采用的是TCP(Transmission Control Protocol)協議。保證了數據傳輸的可靠性。

2、數據報套接字(SOCK_DGRAM

數據報套接字定義了一種無連接的服務。所謂無連接服務,簡單來說,即在發送數據時,無需在收發兩端建立類似TCP那樣的握手連接,在發送時,將數據打包,然后加上遠程IP地址,即可把該數據包發送出去。

數據通過相互獨立的報文進行傳輸。并且是無序的、不可靠的傳輸。

3、原始套接字(SOCK_ROW)

原始套接字是我們需要關心的,因為我們的Socket CAN采用的即是原始套接字。該接口允許對較底層協議進行操作,如IP、ICMP等。原始套接字常用于檢驗新的協議實現或訪問現有服務中配置的新設備。

套接字的工作流程如下:

先啟動服務器,通過調用socket()函數建立一個套接字,然后調用bind()函數將該套接字和本地網絡地址聯系在一起,再調用listen()函數使套接字做好偵聽的準備,并規定它的請求隊列的長度,之后就調用accept()函數來接收連接。客戶端在建立套接字之后就可調用 connect()和服務器建立連接。連接一旦建立,客戶端和服務器之間就可以通過調用recv()/recvfrom()函數和send()/sendto函數來進行發收數據。最后,待數據傳送結束后,雙方調用close()函數關閉套接字。

下面我們來寫兩個簡單的基于Socket的CAN應用程序,但是我們采用的是SOCK_ROW,因此在套接字工作流程上有區別于SOCK_STREAM和SOCK_DGRAM。由于Socket采用C/S模型進行設計的,所以我們的這兩個程序也分別為Server和Client。

首先是server端的程序,我們需要寫一個服務器的程序,該程序接收來自客戶端發來的數據,代碼如下:

int can_recv()

{

int sock_fd;

unsigned long nbytes, len;

struct sockaddr_can addr;

struct ifreq ifr;

/*為了能夠接收CAN報文,我們需要定義一個CAN數據格式的結構體變量*/

struct can_frame frame;

struct can_frame *ptr_frame;

/*建立套接字,設置為原始套接字,原始CAN協議*/

sock_fd = socket(PF_CAN,SOCK_RAW,CAN_RAW);

/*以下是對CAN接口進行初始化,如設置CAN接口名,即當我們用ifconfig命令時顯示的名字*/

strcpy(ifr.ifr_name,"can0");

ioctl(sock_fd, SIOCGIFINDEX, &ifr);

printf("can0 can_ifindex = %x\n",ifr.ifr_ifindex);

/*設置CAN協議*/

addr.can_family = AF_CAN;

addr.can_ifindex = 0;

/*將剛生成的套接字與網絡地址進行綁定*/

bind(sock_fd, (struct sockaddr*)&addr, sizeof(addr));

/*開始接收數據*/

nbytes = recvfrom(sock_fd, &frame, sizeof(struct can_frame), 0, (struct sockaddr *)&addr, &len);

/*get interface name of the received CAN frame*/

ifr.ifr_ifindex = addr.can_ifindex;

ioctl(sock_fd, SIOCGIFNAME, &ifr);

printf("Received a CAN frame from interface %s\n",ifr.ifr_name);

/*將接收到的CAN數據打印出來,其中ID為標識符,DLC為CAN的字節數,DATA為1幀報文的字節數*/

printf("CAN frame:\n ID = %x\n DLC = %x\n" \

"DATA = %s\n",frame.can_id,frame.can_dlc,frame.data);

ptr_frame = &frame;

return 0;

}

接下來是CAN的發送程序,即客戶端,代碼如下:

int can_send()

{

int sock_fd;

unsigned long nbytes;

struct sockaddr_can addr;

struct ifreq ifr;

struct can_frame frame;

/*建立套接字,設置為原始套接字,原始CAN協議*/

sock_fd = socket(PF_CAN,SOCK_RAW,CAN_RAW);

/*以下是對CAN接口進行初始化,如設置CAN接口名,即當我們用ifconfig命令時顯示的名字*/

strcpy((char *)(ifr.ifr_name), "can0");

ioctl(sock_fd, SIOCGIFINDEX, &ifr);

printf("can0 can_ifindex = %x\n", ifr.ifr_ifindex);

addr.can_family = AF_CAN;

addr.can_ifindex = ifr.ifr_ifindex;

/*將剛生成的套接字與CAN套接字地址進行綁定*/

bind(sock_fd, (struct sockaddr*)&addr, sizeof(addr));

/*設置CAN幀的ID號,可區分為標準幀和擴展幀的ID號*/

frame.can_id = 0x1122;

strcpy((char *)frame.data,"hello");

frame.can_dlc = strlen(frame.data);

printf("Send a CAN frame from interface %s\n", ifr.ifr_name);

/*開始發送數據*/

nbytes = sendto(sock_fd, &frame, sizeof(struct can_frame), 0, (struct sockaddr*)&addr, sizeof(addr));

return 0;

}

上面兩個程序看完后,大家可能會有疑問,為什么這兩個程序沒有listen()和accept()函數呢?其實這兩個程序是獨立的運行的,并不像字節流套接字(SOCK_STREAM)和數據報套接字(SOCK_DGRAM),需要先運行服務器進行偵聽。SOCK_STREAM和SOCK_DGRAM的兩個server和client程序是通過網絡相互收發數據。而CAN的socket的server和client程序收發數據的對象是CAN總線。server從CAN總線上接收數據,client將數據發到CAN總線上,當CAN總線上有數據時,server才能接收數據,當CAN總線空閑時,client才能將數據發送出去。

以上是對套接字的簡單理解,并附上socket CAN的簡單上層應用代碼。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • CAN
    CAN
    +關注

    關注

    57

    文章

    2888

    瀏覽量

    466747
  • 服務器
    +關注

    關注

    13

    文章

    9688

    瀏覽量

    87284
  • Socket
    +關注

    關注

    1

    文章

    212

    瀏覽量

    35558

原文標題:為了能夠對Socket CAN的深入理解,我們需要了解Socket的機制

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    FA模型訪問Stage模型DataShareExtensionAbility說明

    FA模型訪問Stage模型DataShareExtensionAbility 概述 無論FA模型還是Stage模型,數據讀寫功能都包含客戶端和
    發表于 06-04 07:53

    RAKsmart高性能服務器集群:驅動AI大語言模型開發的算力引擎

    RAKsmart高性能服務器集群憑借其創新的硬件架構與全棧優化能力,成為支撐大語言模型開發的核心算力引擎。下面,AI部落小編帶您了解RAKsmart如何為AI開發者提供從模型訓練到落地的全鏈路支持。
    的頭像 發表于 04-15 09:40 ?172次閱讀

    如何在RAKsmart服務器上實現企業AI模型部署

    AI模型的訓練與部署需要強大的算力支持、穩定的網絡環境和專業的技術管理。RAKsmart作為全球領先的服務器托管與云計算服務提供商,已成為企業部署AI模型的理想選擇。那么,如何在RAK
    的頭像 發表于 03-27 09:46 ?426次閱讀

    利用RAKsmart服務器托管AI模型訓練的優勢

    AI模型訓練需要強大的計算資源、高效的存儲和穩定的網絡支持,這對服務器的性能提出了較高要求。而RAKsmart服務器憑借其核心優勢,成為托管AI模型訓練的理想選擇。下面,AI部落小編為
    的頭像 發表于 03-18 10:08 ?207次閱讀

    請問是否可以在模型服務器中使用REST請求OpenVINO?預測?

    是否可以在模型服務器中使用 REST 請求OpenVINO?預測?
    發表于 03-05 08:06

    使用face-detection-retail-0004運行OpenVINO?模型服務器時“缺少特定名稱的輸入”怎么解決?

    使用 face-detection-retail-0004 OpenVINO?模型服務器啟動。 通過與 KServe 兼容的 RESTful API 啟動推理: \"inputs
    發表于 03-05 08:05

    昇騰推理服務器+DeepSeek大模型 技術培訓在圖為科技成功舉辦

    2月17日,華為政企業務團隊受邀蒞臨圖為科技深圳總部,并成功舉辦了一場聚焦于《昇騰推理服務器+DeepSeek大模型》的專業知識培訓。 此次培訓活動不僅深化了雙方的技術交流,更標志著昇騰AI
    的頭像 發表于 02-26 17:38 ?518次閱讀
    昇騰推理<b class='flag-5'>服務器</b>+DeepSeek大<b class='flag-5'>模型</b> 技術培訓在圖為科技成功舉辦

    如何確保云服務器上的DeepSeek-R1模型安全?

    確保云服務器上DeepSeek-R1模型的安全性,需要從多個方面入手,以下是一些關鍵措施: 1、使用安全防護工具 Amazon Bedrock Guardrails:AWS提供了Bedrock
    的頭像 發表于 02-12 13:15 ?481次閱讀

    基于 Flexus 云服務器 X 實例體驗大模型部署體驗測評

    也很快。但是大家目前都是在體驗,能不能部署一下試試呢? 今天,我們就以華為云 Flexus 云服務器 X 實例來部署一下,順便測測其性能看看。 在華為云 828 B2B 企業節狂潮中,Flexus X 實例的限時大促銷震撼來襲,絕對是你不容錯過的超級福利!對于那些追求極致算力、對自
    的頭像 發表于 12-24 12:27 ?508次閱讀
    基于 Flexus 云<b class='flag-5'>服務器</b> X 實例體驗大<b class='flag-5'>模型</b>部署體驗測評

    【「大模型啟示錄」閱讀體驗】如何在客服領域應用大模型

    多個因素以確保所選模型能夠滿足企業的具體需求和目標。首先,企業需要明確自己的客服需求和目標。例如,是否需要24小時在線客服服務?是否需要處理復雜問題的能力?是否需要個性化服務?明確這些需求有助于企業更好
    發表于 12-17 16:53

    socket 客戶端與服務器的實現

    1. 理解Socket 在計算機網絡中,socket是一種通信機制,允許兩個程序(一個客戶端和一個服務器)通過網絡進行通信。在Python中,可以使用
    的頭像 發表于 11-12 14:30 ?735次閱讀

    socket 與 RESTful API 的使用

    Socket是一種網絡通信協議,它允許程序在網絡中進行雙向通信。Socket分為客戶端Socket服務器
    的頭像 發表于 11-12 14:22 ?788次閱讀

    AI模型托管原理分析

    AI模型托管是指將訓練好的AI模型部署在云端或邊緣服務器上,由第三方平臺提供模型運行、管理和優化等服務。以下,AI部落小編將對AI
    的頭像 發表于 11-07 09:33 ?734次閱讀

    GPU服務器AI網絡架構設計

    眾所周知,在大型模型訓練中,通常采用每臺服務器配備多個GPU的集群架構。在上一篇文章《高性能GPU服務器AI網絡架構(上篇)》中,我們對GPU網絡中的核心術語與概念
    的頭像 發表于 11-05 16:20 ?1071次閱讀
    GPU<b class='flag-5'>服務器</b>AI網絡架構設計

    Al大模型機器人

    )大模型AI機器人采用中英文雙語應用,目前的知識圖譜包括了金航標和薩科微所有的產品內容、應用場景、產品的家屬參數等,熱賣的型號S8050、TL431、SS8550、FR107、LM321、ZMM5V6
    發表于 07-05 08:52