套接字linux
❶ linux 文件類型有哪幾種
LINUX中的七種文件類型
d
目錄文件。
l
符號鏈接(指向另一個文件,類似於瘟下的快捷方式)。
s
套接字文件。
b
塊設備文件,二進制文件。
c
字元設備文件。
p
命名管道文件。
-
普通文件,或更准確地說,不屬於以上幾種類型的文件
❷ 為什麼linux中監聽套接字時最大能監聽多少套接字
linux下,拋開性能上的影響,程序監聽套接字的數量限制主要幾個方面:
1:操作系統方面限制是句柄數量的限制,也就是65535個可用句柄去掉預先保留的,大概在5萬個左右,注意文件句柄和套接字句柄是共用的,都在這65535個裡面。
2:進程方面的限制,linux系統對單個進程的默認打開句柄數量限制是1024,考慮到文件操作也會佔用句柄,可用於socket監聽的句柄大概1000個,這個限制可以修改,不同linux版本可能有點不一樣,centos是通過命令 ulimit -n 的方式去修改,要改成10240,就是
3:IO模型的限制,select模型的限制是1024,個,epoll是無限制的,完全根據上面2個的最大值。
❸ linux網路編程:圖文詳解網路協議之原始套接字
學習編程不應停留在表面,要深入理解編程思維,而非僅僅記憶語法。
在大多數情況下,套接字(Socket)主要分為兩類:流式套接字(SOCK_STREAM)和數據報式套接字(SOCK_DGRAM)。
流式套接字(SOCK_STREAM)是面向連接的套接字,適用於面向連接的TCP服務應用。
數據報式套接字(SOCK_DGRAM)是無連接的套接字,對應於無連接的UDP服務應用。
從用戶的角度來看,這兩類套接字似乎可以涵蓋TCP/IP應用的所有需求,因為基於TCP/IP的應用在傳輸層只可能建立在TCP或UDP協議之上。
然而,SOCK_STREAM和SOCK_DGRAM無法完成以下任務:
(1)如何發送自定義的IP包?
(2)如何發送ICMP協議包?
(3)如何使本機進入混雜模式,從而進行網路嗅探?
(4)如何分析所有經過網路的包,無論這些包是否是發送給本機的?
(5)如何偽裝本地的IP地址?
因此,我們需要探討原始套接字(Raw Socket)這一技術點,它在高級網路編程中廣泛應用,同時也被用作黑客手段。
原始套接字(Raw Socket)與標准套接字(SOCK_STREAM、SOCK_DGRAM)的主要區別在於:
原始套接字(Raw Socket)直接置"根"於操作系統網路核心,是完整的網路協議,沒有經過過濾和處理。
標准套接字(SOCK_STREAM、SOCK_DGRAM)則"懸浮"於TCP和UDP協議的外圍,已經處理掉了網路協議的報頭信息,只得到了信息正文部分。
使用原始套接字,可以根據協議結構自定義IP包。目前,IPV4協議報頭如下:
偏移欄位:用於指示IP數據報分片後的片偏移量。
報頭長度:用於指示IPv4首部的長度(可變),通過報頭長度可以計算出IPv4首部的長度,最小20位元組,最大60位元組。
偏移量:TCP首部的長度是可變的,用偏移量欄位表示TCP首部的長度,以4位元組為單位。
報文長:UDP報文的長度欄位(2位元組)指的是整個UDP報文的長度,包括報文頭部和數據部分的總長度。
ICMP協議是網路層中一個非常重要的協議,它使用IP協議進行信息傳遞,向數據包中的源端節點提供發生在網路層的錯誤信息反饋。
常用的回送與回送響應ICMP消息對應數據結構為:
學習是一個循序漸進的過程,知識需要慢慢積累。
理論基礎已具備,現在是時候動手實踐了。以下提供[Linux]原始套接字(Raw Socket)的完整示例代碼,供大家學習交流,趕緊ctrl-c ctrl-v測試一下吧。
❹ Linux 進程間套接字通信(Socket)基礎知識
姓名:羅學元 學號:21181214375 學院:廣州研究院
【嵌牛導讀】Linux進程間套接字通信基礎
【嵌牛鼻子】Linux 進程間套接字及通信介紹
【嵌牛提問】Linux進程間套接字包含哪些內容,如何實現通信
一、套接字(Socket)通信原理
套接字通信允許互聯的位於不同計算機上的進程之間實現通信功能。
二、套接字的屬性
套接字的特性由3個屬性確定,它們分別是:域、類型和協議。
1. 套接字的域
它指定套接字通信中使用的網路介質,最常見的套接字域是AF_INET,它指的是Internet網路。當客戶使用套接字進行跨網路的連接時,它就需要用到伺服器計算機的IP地址和埠來指定一台聯網機器上的某個特定服務,所以在使用socket作為通信的終點,伺服器應用程序必須在開始通信之前綁定一個埠,伺服器在指定的埠等待客戶的連接。
另一個域AF_UNIX表示UNIX文件系統,就是文件輸入/輸出,它的地址就是文件名。
2. 套接字類型
網際網路提供了兩種通信機制:流(stream)和數據報(datagram),因而套接字的類型也就分為流套接字和數據報套接字。我們主要看流套接字。
流套接字由類型SOCK_STREAM指定,它們是在AF_INET域中通過TCP/IP連接實現,同時也是AF_UNIX中常用的套接字類型。
流套接字提供的是一個有序、可靠、雙向位元組流的連接,因此發送的數據可以確保不會丟失、重復或亂序到達,而且它還有一定的出錯後重新發送的機制。
與流套接字相對的是由類型SOCK_DGRAM指定的數據報套接字,它不需要建立連接和維持一個連接,它們在AF_INET中通常是通過UDP/IP實現的。它對可以發送的數據的長度有限制,數據報作為一個單獨的網路消息被傳輸,它可能丟失、復制或錯亂到達,UDP不是一個可靠的協議,但是它的速度比較高,因為它並不需要總是要建立和維持一個連接。
3.套接字協議
只要底層的傳輸機制允許不止一個協議來提供要求的套接字類型,我們就可以為套接字選擇一個特定的協議。通常只需要使用默認值。
三、套接字地址
每個套接字都有其自己的地址格式,對於AF_UNIX域套接字來說,它的地址由結構sockaddr_un來描述,該結構定義在頭文件
struct sockaddr_un{
sa_family_t sun_family; //AF_UNIX,它是一個短整型
char sum_path[]; //路徑名
};
對於AF_INET域套接字來說,它的地址結構由sockaddr_in來描述,它至少包括以下幾個成員:
struct sockaddr_in{
short int sin_family; //AN_INET
unsigned short int sin_port; //埠號
struct in_addr sin_addr; //IP地址
}
而in_addr被定義為:
struct in_addr{
unsigned long int s_addr;
}
四、基於流套接字的客戶/伺服器的工作流程
使用socket進行進程通信的進程採用的客戶/伺服器系統是如何工作的呢?
1.伺服器端
首先,伺服器應用程序用系統調用socket來創建一個套接字,它是系統分配給該伺服器進程的類似文件描述符的資源,它不能與其他的進程共享。
接下來,伺服器進程會給套接字起個名字,我們使用系統調用bind來給套接字命名。然後伺服器進程就開始等待客戶連接到這個套接字。
然後,系統調用listen來創建一個隊列,並將其用於存放來自客戶的進入連接。
最後,伺服器通過系統調用accept來接受客戶的連接。它會創建一個與原有的命名套接不同的新套接字,這個套接字只用於與這個特定客戶端進行通信,而命名套接字(即原先的套接字)則被保留下來繼續處理來自其他客戶的連接。
2.客戶端
基於socket的客戶端比伺服器端簡單。同樣,客戶應用程序首先調用socket來創建一個未命名的套接字,然後講伺服器的命名套接字作為一個地址來調用connect與伺服器建立連接。
一旦連接建立,我們就可以像使用底層的文件描述符那樣用套接字來實現雙向數據的通信。