unix域协议可用于同一台主机之间的通信,和前面的IP协议大同小异,只不过不需要IP地址域端口,而是一个文件地址,这个文件可以是存在的文件也可以是不存在的文件,最好是用一个不存在的文件,因为就算不存在也会自动建立,一个文件只有在首次被使用的时候才可以,所以我们在每次bind之前都会先删除文件,所以如果使用已经存在的文件可能会造成数据丢失。
下面是使用SOCK_DGRAM套接字实现的
/*send*/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include<arpa/inet.h>
#include<linux/un.h>
#define PATH "/home/luoxin/recv.socket"
int main(int argc, char *argv[]) {
int sock_fd = -1;
int ret = -1;
char buf[1024];
struct sockaddr_un addr;
struct sockaddr_un my_addr;
//创建一个套接字
sock_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, PATH);
//发送消息
while(1) {
scanf("%s",buf);
sendto(sock_fd, buf, strlen(buf), 0, (struct sockaddr*)&addr, sizeof(addr));
}
}
/*recv*/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include<arpa/inet.h>
#include<linux/un.h>
#define PATH "/home/luoxin/recv.socket"
int main(int argc, char *argv[]) {
int sock_fd = -1;
int ret = -1;
char buf[1024];
struct sockaddr_un dest_addr;
//创建套接字
sock_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
//套接字绑定一个地址
dest_addr.sun_family = AF_UNIX;
strcpy(dest_addr.sun_path, PATH);
unlink(PATH);
bind(sock_fd, (struct sockaddr*)&dest_addr, sizeof(dest_addr));
//接收数据
while(1) {
ret = recvfrom(sock_fd, buf, 1023, 0, NULL, 0);
if(ret > 0) {
buf[ret] = '\0';
printf("收到消息:%s\n",buf);
}
}
}
下面是使用SOCK_STREAM套接字实现的,实现的有点粗糙,可以通信,反正和TCP通信一样。
/*send*/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include<arpa/inet.h>
#include<linux/un.h>
#define PATH "/home/luoxin/1.txt"
int main(int argc, char *argv[]) {
int sock_fd = -1;
int ret = -1;
char buf[1024];
struct sockaddr_un addr;
//创建一个套接字
sock_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, PATH);
//和接收方建立连接
ret = connect(sock_fd, (struct sockaddr*)&addr, sizeof(addr));
if(ret == -1) {
perror("connect error");
return -1;
}
//发送消息
while(1) {
scanf("%s",buf);
sendto(sock_fd, buf, strlen(buf), 0, (struct sockaddr*)&addr, sizeof(addr));
}
}
/*recv*/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include<arpa/inet.h>
#include<linux/un.h>
#define PATH "/home/luoxin/1.txt"
int main(int argc, char *argv[]) {
int sock_fd = -1;
int ret = -1;
char buf[1024];
struct sockaddr_un dest_addr;
//创建套接字
sock_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
//套接字绑定一个地址
dest_addr.sun_family = AF_UNIX;
strcpy(dest_addr.sun_path, PATH);
unlink(PATH);
bind(sock_fd, (struct sockaddr*)&dest_addr, sizeof(dest_addr));
//listen
listen(sock_fd, 10);
//accept
accept(sock_fd, NULL, 0);
//接收数据
while(1) {
ret = recvfrom(sock_fd, buf, 1023, 0, NULL, 0);
if(ret > 0) {
buf[ret] = '\0';
printf("收到消息:%s\n",buf);
}
}
}