Linux IPC udp/tcp/UNIX域 socket编程
UNIX域套接字本地通信即在socket第一個參數中選擇AF_LOCAL,socket是BSD提出的一種適用于所有的情況的進程間通信的方式,雖然現在多用于網絡通信,但是本機內的進程間通信也是沒有問題的,使用socket機制的UNIX域常用在前臺進程和后臺進程的通信。VS tcp/ip和udp/ip的socket在CS兩端使用的讀寫sockfd函數不同,在UNIX域下,CS兩端都使用read()/write()對socket進行讀寫。
模型
#include <unistd.h> #include <sys/types.h> #include <sys/socket.h> //服務器: socket() //創建socket struct sockaddr_in //準備通信sock文件 bind() //綁定socket和addr write()/read() //進行通信 close() //關閉socket //客戶端:socket() //創建socket //準備通信地址:服務器準備的sock文件 connect() //鏈接socket和通信地址 write()/read() //進行通信 close() //關閉socketsocket()
//創建網絡端點,返回socket文件描述符,失敗返回-1設errno int socket(int domain, int type, int protocol);domain :協議族(protocol family)(網絡通訊(IP)還是本地通訊(xxx.socket))
- AF_LOCAL本地通訊/AF_UNIX/
type :協議
- SOCK_STREAM //流式套接字, 實現包括但不限于TCP協議,which is有序,可靠雙向面向連接的字節流通信方式
- SOCK_DGRAM //數據報套接字, 實現包括但不限于UDP協議, which is不可靠,無連接的數據報通信方式
protocol: 特殊協議, 一般給0
準備通信地址:
struct sockaddr{ //主要用于函數的形參類型, 很少定義結構體變量使用, 叫做通用的通信地址類型//$man bindsa_family_t sa_family;char sa_data[14]; } struct sockaddr_un{ //準備本地通信的通信地址 //$man un.hsa_family_t sun_family;//協議族,就是socket()的domain的AF_LOCALchar sun_path[];//文件的路徑 }bind()
//把通信地址和socket文件描述符綁定,用在服務器端,成功返回0,失敗返回-1設errno int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);sockfd: socket文件的fd(returned by socket())
addr: 需要強制類型轉換成socketaddr_un或soketaddr_in, 參見上
addrlen: 通信地址的大小, 使用sizeof();
connect():
//初始化一個socket的連接,用在客戶端,成功返回0,失敗返回-1設errno int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);sockfd: socket文件的fd(returned by socket())
addr: 需要強制類型轉換成socketaddr_un或soketaddr_in, 參見上
addrlen: 通信地址的大小, 使用sizeof();
例子
//UNIX域數據報socket進程間通信 #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<sys/un.h> #include<stdio.h> #include<stdlib.h> #include<string.h> int main(){//1. create socketint sockfd=socket(AF_LOCAL,SOCK_DGRAM,0); if(-1==sockfd)perror("socket"),exit(-1);printf("create socket successfully\n");//2. prepare communication addrstruct sockaddr_un addr;addr.sun_family=AF_LOCAL;strcpy(addr.sun_path,"a.sock"); //會自動創建a.sock文件//3. bind socket and addrint res=bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)); //客戶端是connect()if(-1==res)perror("bind"),exit(-1);printf("bind successfully\n");//4. communicatechar buf[100]={0};res=read(sockfd,&buf,sizeof(buf)); //客戶端是write()if(-1==res)perror("read"),exit(-1);printf("data sent by client:%s,size is %d\n",buf,sizeof(buf));//5. close socketres=close(sockfd);if(-1==res)perror("close"),exit(-1);printf("close successfully\n");return 0; }轉載于:https://www.cnblogs.com/xiaojiang1025/p/6032531.html
總結
以上是生活随笔為你收集整理的Linux IPC udp/tcp/UNIX域 socket编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2016 ACM/ICPC Asia R
- 下一篇: 使用实体框架、Dapper和Chain的