UNIX域通信
1>什么是域通信?
本地进程间通信,无法跨越主机
2>域通信有什么作用?
本地进程间通信
3>和之前学到的通信方法有什么区别?
TCP和UDP:通过IP和端口号进行数据跨越主机的进程间通信
特点:通过网络,容易受到网络波动的影响,且占用的网络资源较多
域通信:
TCP和UDP:通过s套接字文件进行数据的进程间通信
特点:不通过网络,而是通过linux的s套接字文件进行数据发送,不受
网络波动影响,效率更高,稳定性更强
socket:
socket
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
功能:
建立socket连接
参数:
domain:协议
AF_UNIX, AF_LOCAL Local communication unix(7) 地址族
本地连接协议 域通信
AF_INET IPv4 Internet protocols ip(7)
IPv4协议
AF_INET6 IPv6 Internet protocols ipv6(7)
IPv6协议
type:类型
SOCK_STREAM:流式套接字 (TCP)
SOCK_DGRAM:数据报文套接字 (UDP)
SOCK_RAW:原始套接字
protocol:0,前面的配置可用
bind:
struct sockaddr_in---IPv4
#include <sys/un.h>
struct sockaddr_un {
sa_family_t sun_family; /*PF_UNIX或AF_UNIX */地址族
char sun_path[UNIX_PATH_MAX]; /* 路径名 */文件路径
};
拓展:
删除文件
remove
#include <stdio.h>
int remove(const char *pathname);
参数:
文件名字
返回值:成功返回0
失败返回-1,并返回错误码
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>
#define PORT 10010
int main(){
//创建套接字
int sockfd=socket(AF_INET,SOCK_DGRAM,0); //使用ipv4 UDP协议
if(sockfd<0){
perror("socket error");
exit(-1);
}
//允许发送广播
int on=1;
setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,&on,sizeof(on));
//设立广播地址
struct sockaddr_in broadcast;
broadcast.sin_family=AF_INET;
broadcast.sin_port=htons(PORT);
broadcast.sin_addr.s_addr=inet_addr("192.168.50.255");
char buf[50];
while(1){
bzero(buf,sizeof(buf));
scanf("%s",buf);
sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&broadcast,sizeof(broadcast));
}
return 0;
}