一、Socket程序間通信
基本特點:
Socket是一種接口技術,被抽象成一個檔案夾來操作,可以讓同一台計算機的程序之間通信,也可以讓不同計算機的程序間通信(網絡)
同一台計算機的程序間通信:
底層需要借助socket檔案,進行同一計算機下的程序間通信
int socket(int domain, int type, int protocol);
功能:建立socket對象
domain:
AF_UNIX/AF_LOCAL 本地通信,程序間通信
AF_INET 基于IPv4位址通信
AF_INET6 基于IPv6位址通信
type:
SOCK_STREAM 資料流協定
SOCK_DGRAM 資料報協定
protocol:
特殊的通信協定,一般不用,寫0即可
傳回值:成功傳回socket描述符,失敗傳回-1
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:綁定socket和通信位址
sockfd:socket描述符
addr:
實際傳遞的是sockaddr_un或者sockaddr_in 但是要把它們轉換為sockaddr類型
#include <sys/un.h> [vim /usr/include/linux/un.h]
struct sockaddr_un {
__kernel_sa_family_t sun_family; //domain寫什麼就填什麼
char sun_path[UNIX_PATH_MAX]; //socket檔案路徑
};
網絡通信位址類型:
#include <netinet/in.h>
sockaddr_in {
__kernel_sa_family_t sin_family; //domain寫什麼就填什麼
__be16 sin_port; //端口号
struct in_addr sin_addr; //IP位址
}
struct in_addr{
__be32 s_addr;
}
addrlen:位址結構體的位元組數
傳回值:成功傳回0,失敗傳回-1
int listen(int sockfd, int backlog);
功能:監聽socket,資料流通信時使用
sockfd:socket描述符
backlog:排隊數量
傳回值:成功傳回0,失敗傳回-1
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:等待連接配接,資料流通信時使用
sockfd:socket描述符
addr:擷取連接配接者的位址
addrlen:既是輸入也是輸出
既要告訴accept函數目前系統位址結構體的位元組數,同時也能夠擷取發送者的位址結構體的位元組數
傳回值:
成功傳回是一個建立連接配接後的socket描述符,失敗傳回-1
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:連接配接socket
sockfd:socket描述符
addr:目标位址
addrlen:位址結構體的位元組數
傳回值:成功傳回0,失敗傳回-1
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:向連接配接成功的sockfd發送資料,資料流中使用
sockfd:連接配接成功後的socket描述符
buf:待發送的資料記憶體首位址
len:要發送的位元組數
flags:一般寫0即可
MSG_DONTWAIT 不阻塞
MSG_OOB 優先發送緊急資料
傳回值:成功發送的位元組數,失敗傳回-1
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:從連接配接成功後的sockfd中讀取資料,資料流中使用
sockfd:連接配接成功後的socket描述符
buf:存儲讀取到的資料的記憶體首位址
len:存儲資料的記憶體的位元組數
flags:一般寫0即可
MSG_DONTWAIT 不阻塞
MSG_OOB 優先接收緊急資料
傳回值:成功接收到的位元組數,-1出現錯誤,0連接配接斷開
本地socket程序間通信程式設計模型:
程序A 程序B
建立socket對象 建立socket對象
準備通信位址 準備通信位址
綁定socket和位址 ...
監聽 ...
等待連接配接 連接配接
接收/發送資料 發送/接收資料
關閉socket 關閉socket
删除socket