1. 程式人生 > >Linux IPC總結(全)

Linux IPC總結(全)

Socket
  套接字(Socket)是由Berkeley在BSD系統中引入的一種基於連線的IPC,是對網路介面(硬體)和網路協議(軟體)的抽象。它既解決了無名管道只能在相關程序間單向通訊的問題,又解決了網路上不同主機之間無法通訊的問題。

  套接字有三個屬性:域(domain)、型別(type)和協議(protocol),對應於不同的域,套接字還有一個地址(address)來作為它的名字。

  域(domain)指定了套接字通訊所用到的協議族,最常用的域是AF_INET,代表網路套接字,底層協議是IP協議。對於網路套接字,由於伺服器端有可能會提供多種服務,客戶端需要使用IP埠號來指定特定的服務。AF_UNIX代表本地套接字,使用Unix/Linux檔案系統實現。

  IP協議提供了兩種通訊手段:流(streams)和資料報(datagrams),對應的套接字型別(type)分別為流式套接字和資料報套接字。流式套接字(SOCK_STREAM)用於提供面向連線、可靠的資料傳輸服務。該服務保證資料能夠實現無差錯、無重複傳送,並按順序接收。流式套接字使用TCP協議。資料報套接字(SOCK_DGRAM)提供了一種無連線的服務。該服務並不能保證資料傳輸的可靠性,資料有可能在傳輸過程中丟失或出現數據重複,且無法保證順序地接收到資料。資料報套接字使用UDP協議。

  一種型別的套接字可能可以使用多於一種的協議來實現,套接字的協議(protocol)屬性用於指定一種特定的協議。

1
2
#include <sys/types.h>
#include <sys/socket.h>

  (1) 建立套接字

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

  對於SOCK_STREAM和SOCK_DGRAM而言,分別只有一種協議支援這種型別的套接字。因此protocol可以為0,表示預設的協議。
  每種套接字域都有一種對應的套接字地址。對於AF_UNIX和AF_INET,套接字地址分別為sockaddr_un和sockaddr_in,位於<sys/un.h>和<sys/in.h>中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct sockaddr_un{ 
    sa_family_t sun_family; //AF_UNIX
    char sun_path[];    //pathname
};
 
struct sockaddr_in{ 
    short int sin_family; //AF_INET 
    unsigned short int sin_port; 
    struct in_addr sin_addr;
    //...  
};
 
struct in_addr{ 
    unsigned long int s_addr;//可以使用inet_addr()把IP地址字串轉換成
		//  網路位元組序(network byte order,使用大端模式)的二進位制資料
};

  (2) 命名套接字

1
int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);//將無名套接字sockfd與addr繫結(bind)

  (3) 監聽套接字

1
int listen(int sockfd,int backlog);//backlog限定了等待服務的佇列的最大長度

  (4) 等待接受連線

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

  當客戶端程式嘗試連線sockfd套接字時,accept返回一個新的套接字與客戶端進行通訊。如果addr不是NULL,那麼客戶端的地址將會儲存在addr所指向的結構體中;呼叫accept()前必須先將addrlen初始化為addr所指向結構體的大小,accept()返回以後,addrlen將會被設定成客戶端套接字地址結構體的實際大小。然後,通過對accept()返回的套接字執行read()和write()操作即可實現與客戶端的簡單的通訊。

  (5) 建立連線(客戶端)

1
int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);

  connect()在無名套接字sockfd和addr之間建立連線。addr指向的結構體中可以包含伺服器的IP地址和埠號等資訊。

  (6) 資料傳輸

1
2
ssize_t send(int sockfd,const void *buf,size_t len,int flags);
ssize_t recv(int sockfd, void *buf, size_t len,int flags);

  (7) 關閉套接字

1
int close(int fd);

  (8) 主機位元組序和網路位元組序的轉換

1
2
3
4
5
#include <netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);  //host to network,long
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);

  long型函式用來轉換sockaddr_in.in_addr.s_addr;short型函式用來轉換sockaddr_in.sin_port。

總結:

相關推薦

Linux IPC總結

Socket   套接字(Socket)是由Berkeley在BSD系統中引入的一種基於連線的IPC,是對網路介面(硬體)和網路協議(軟體)的抽象。它既解決了無名管道只能在相關程序間單向通訊的問題,又解決了網路上不同主機之間無法通訊的問題。   套接字有三個屬性:域(domain)、型別(type)和協議(

LinuxIPC總結

System V IPC     System V IPC指的是AT&T在System V.2發行版中引入的三種程序間通訊工具:(1)訊號量,用來管理對共享資源的訪問 (2)共享記憶體,用來高效地實現程序間的資料共享 (3)訊息佇列,用來實現程序間資料的傳遞。我們把這三種工具統稱為System

Linux命令總結

查看登陸 oca 下一個 同時 找到 刪除用戶 mtime 高亮 數值 1.ls [選項] [目錄名 | 列出相關目錄下的所有目錄和文件 -a 列出包括.a開頭的隱藏文件的所有文件 -A 通-a,但不列出"."和".." -l 列出文件的詳細信息 -c 根據ctim

Linux學習總結 windos環境vmware安裝centos7

color 學習總結 oot 遠程訪問服務 分享圖片 watermark 需要 mage 磁盤大小 1.在這裏我先簡單介紹下虛擬化技術,就是我們通過軟件虛擬化出來一個硬件環境,然後就可以在系統裏面安裝子系統,以來我們避免了裝linux,windos雙系統的麻煩,二來我們可以

Linux學習總結 網絡配置-NAT方式靜態IP配置篇

開機啟動 log scrip 分享 如何快速 報錯 網絡服務 重新 查找 一:DHCP 服務驗證 1: 之前我們在裏面已經裝好了centos,當時我們選擇的組網方式為NAT方式,那麽我們怎麽樣如何快速實現虛擬機系統訪問外網呢?能不能直接上網呢,來我們試一下ping baid

Linux學習總結-su命令 sudo 命令 限制root遠程登錄

su - rest 一次 com 註冊 情況 保存配置文件 所有權 是把 root 用戶擁有至高無上的權利,那麽我們運維人員是不是直接在root用戶下處理所有問題呢?答案是否定的,權力越大,責任越大,人是會犯錯的,因此我們要在不影響我們的工作情況下,盡量限制我們的權力,以免

Linux學習總結-磁盤格式化,掛載,swap擴容

圖片 目前 ext4 deb fec 方式 alt lin 磁盤 上次我們學習了磁盤分區,磁盤分區完後還不能直接使用,需要對分區進行格式化,載入某個類型的文件系統,然後掛載到相應目錄下才可使用。 一 磁盤格式化 格式化命令: mke2fs -t [ext2 ext3 ext

Linux學習總結-源碼包和rpm包安裝

onf 之間 免費版 好的 remove 提高 裝包 rem 好處 我們熟悉下linux 軟件安裝:https://zhidao.baidu.com/question/504980243.html這裏寫了源碼安裝和yum安裝的優缺點,可以看看 一.源碼包安裝 通常辦法是安裝

Linux學習總結十三文本編輯器 vim

vim linux 文本編輯器 vim是vi的升級版,會根據文本屬性帶色彩顯示,具體用法如下: 一般模式 : 1.光標定位: 左右移動一個字符, h l上下移動一個字符, k j左右下上 ,左右在兩邊,下上在中間這樣記光標定位行首 shift+6 也就是^光標定位行尾

Linux學習總結49——應當竭力避免在系統中執行的 Linux 命令

前言 如果你是一個 Linux 新手,在好奇心的驅使下,可能會去嘗試從各個渠道獲得的命令。以下是 7 個致命的 Linux 命令,輕則使你的資料造成丟失,重則使你的系統造成癱瘓,所以,你應當竭力避免在系統中執行它們。 一、rm -rf 此命令將遞歸併強制刪除 / 目錄下的所有檔案。這

Linux awk總結

雖然sed編輯器是非常方便自動修改文字檔案的工具,但其也有自身的限制。通常你需要一個用來處理文字檔案中的資料的更高階工具,它能提供一個類程式設計環境來修改和重新組織檔案中的資料,而這正式awk能夠做到的。awk讓流編輯邁上了一個新的臺階,它提供了一種程式語言而不只是編輯器命令。在awk中,你可以做下

Intel IPP密碼庫 IPPCP 2018 開發筆記與總結

Part I. 開發指南 內容參考官方文件 《Intel® Integrated Performance Primitives Cryptography Developer Guide, Intel Integrated Performance Primitives 2018》 1. G

Linux 學習總結

一. yum 命令 1.列出所有可更新的軟體清單命令:yum check-update 2.更新所有軟體命令:yum update 3.僅安裝指定的軟體命令:yum install <package_name> 4.僅更新指定的軟體命令:yum update <package_nam

Linux學習總結

    第一次寫部落格有很多不懂的,但是還是希望把自己學到的東西分享給大家,Linux也是剛接觸,希望能收穫更多。 學習Linux首先要了解Linux,知道什麼是Linux        Linux的核心原型是1991年由託瓦茲(Linus Torvalds)寫出來的

MySql資料庫常用命令總結

一、資料庫級命令 1. 資料庫連線 命令:mysql -h主機地址 -u使用者名稱 -p使用者密碼 –port=3307 1、找到安裝目錄bin, 進入該工作目錄,鍵入該命令mysql -u root -p,提示輸入密碼,使用者名稱前可以有空格也可以沒

Sublime Text 快捷鍵、常用外掛、使用技巧總結

Sublime Text 1、其他快捷操作及設定-->推薦 (1)矩形選區選取,游標移動到矩形選區的左上角,按住shift,右鍵移動滑鼠即可(1.擴選多行,Ctrl+Shift+L,游標會變為多行編輯。2.按住Ctrl+Alt,然後↑鍵或者↓鍵。3.按住Ctrl

Linux學習總結29——CentOS 6和CentOS 7區別總結

centos7與6之間最大的差別就是初始化技術的不同,7採用的初始化技術是Systemd,並行的執行方式,除了這一點之外,服務啟動、開機啟動檔案、網路命令方面等等 1.系統初始化技術 Sysvini

Linux學習總結

    (二)Linux常用命令     1. 獲取root許可權           su    ——————————————切換當前使用者到root使用者           sudo    ——

Linux學習總結6——CenterOS7安裝mysql5.5的方法

首先centos7 已經不支援mysql,因為收費了你懂得,所以內部集成了mariadb,而安裝mysql的話會和mariadb的檔案衝突,所以需要先解除安裝掉mariadb,以下為解除安裝mari

Linux學習總結

         最近工作關係用到了Linux,現在把用到的總結一下。    (一)Linux連線工具putty        可以利用putty工具連線遠端的Linux伺服器,同類的軟體還有xs