Linux网络编程 之 套接字(四)
目錄
1. 套接字的定義
2. 套接字的創建方法
3. 套接字的地址
- 本地套接字
- 網絡套接字
1. 套接字的定義
套接字是一種通信機制(通信的兩方的一種約定),憑借這種機制,不同主機之間的進程可以進行通信。我們可以用套接字中的相關函數來完成通信過程。
2. 套接字的創建方法
#include <sys/socket.h> int socket(int family,int type,int protocol);參數:
family:協議族
指定套接字通信中使用的網絡介質,最常見的套接字域是 AF_UNIX 和 AF_INET。
AF_UNIX用于通過 Unix 和 Linux 文件系統實現的本地套接字
AF_INET用于 Unix 網絡套接字。AF_INET 套接字可以用于通過包括因特網在內的 TCP/IP 網絡進行通信的程序。
type:套接字類型
流套接字(SOCK_STREAM):
流套接字用于提供面向連接、可靠的數據傳輸服務。該服務將保證數據能夠實現無差錯、無重復發送,并按順序接收。流套接字之所以能夠實現可靠的數據服務,原因在于其使用了傳輸控制協議,即TCP(The Transmission Control Protocol)協議。
數據報套接字(SOCK_DGRAM):
數據報套接字提供了一種無連接的服務。該服務并不能保證數據傳輸的可靠性,數據有可能在傳輸過程中丟失或出現數據重復,且無法保證順序地接收到數據。數據報套接字使用UDP(User Datagram Protocol)協議進行數據的傳輸。由于數據報套接字不能保證數據傳輸的可靠性,對于有可能出現的數據丟失情況,需要在程序中做相應的處理。
原始套接字(SOCK_RAW):
原始套接字與標準套接字(標準套接字指的是前面介紹的流套接字和數據報套接字)的區別在于:原始套接字可以讀寫內核沒有處理的IP數據包,而流套接字只能讀取TCP協議的數據,數據報套接字只能讀取UDP協議的數據。因此,如果要訪問其他協議發送數據必須使用原始套接字。
protocal:套接字協議
協議類別(0、IPPROTO_TCP、IPPROTO_UDP等),設為 0 表示使用默認協議。
int socket(int family,int type,int protocol);該構造方法成功則返回一個套接字,失敗子返回一個小于0的整數。
3. 套接字的地址
創建了一個套接字后,還必須進行綁定地址才能使用這個套接字。
本地套接字
對于本地套接字 AF_UNIX 來說,首先它的創建的域參數應該是PF_LOCAL或者PF_UNIX,而不能用PF_INET之類。本地套接字的通訊類型應該是SOCK_STREAM或SOCK_DGRAM,協議為默認協議。
創建套接字:
int sockfd; sockfd = socket(PF_LOCAL, SOCK_STREAM, 0);本地套接字的綁定的的地址是struct sockaddr_un結構,truct sockaddr_un結構有兩個參數:sun_family、sun_path。sun_family只能是AF_LOCAL或AF_UNIX,而sun_path是本地文件的路徑。
sockaddr_un結構體:
struct sockaddr_un { sa_family_t sun_family; //套接字域 char sun_path[]; //本地文件的路徑 };套接字綁定地址:
struct sockaddr_un sun;sun.sun_family = AF_LOCAL;strcpy(sun.sun_path, filepath);bind(sockfd, (struct sockaddr*)&sun, sizeof(sun));網絡套接字
而網絡套接字AF_INET的結構由sockaddr_un 來描述:
struct sockaddr_in { short int sin_family; //套接字域 unsigned short int sin_port; //端口 struct in_addr sin_addr; //IP地址}IP 地址結構 in_addr 被定義如下:
struct in_addr { unsigned long int }總結
以上是生活随笔為你收集整理的Linux网络编程 之 套接字(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 网络编程——网络字节序(三)
- 下一篇: Linux网络编程 之 广播(五)