简单使用AF_UNIX域:本地连接实现ser和cli之间的通信
文件系统套接字缺点:除非使用绝对路径名,否则该套接字会被创建在服务器所在目录下,并且需要将他创建在其他客户端都可访问的全局目录/tmp下,相比之下,网络套接字只需要使用一个未使用的端口即可
功能描述:客户端将字符A发送给服务器,服务器将字符A加1,将B回复给客户端,客户端打印结果
- 服务器ser.c
#include <stdio.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
void server()
{
int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if(sockfd == -1)
{
perror("socket err");
return;
}
struct sockaddr_un saddr;
struct sockaddr_un caddr;
saddr.sun_family = AF_UNIX;
//清除该文件系统下的server文件
unlink("server");
strcpy(saddr.sun_path, "server");
int ret = bind(sockfd, (struct sockaddr*)&saddr, sizeof(saddr));
if(ret == -1)
{
perror("bind err");
return;
}
ret = listen(sockfd, 5);
if(ret == -1)
{
perror("listen err");
return;
}
while(1)
{
char ch;
printf("server waiting...\n");
int len = sizeof(caddr);
int csockfd = accept(sockfd, (struct sockaddr*)&caddr, &len);
read(csockfd, &ch, 1);
ch++;
write(csockfd, &ch, 1);
close(csockfd);
}
}
int main()
{
server();
return 0;
}
- 客户端cli.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <string.h>
//适用于本地IPC的AF_UNIX
void client()
{
//创建套接字
int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
if(sockfd == -1)
return;
struct sockaddr_un caddr;
caddr.sun_family = AF_UNIX;
strcpy(caddr.sun_path, "server");
int ret = connect(sockfd, (struct sockaddr*)&caddr, sizeof(caddr));
if(ret == -1)
{
perror("connect err");
return;
}
char ch = 'A';
write(sockfd, &ch, 1);
read(sockfd, &ch, 1);
printf("from ser ch : %c\n", ch);
close(sockfd);
}
int main()
{
client();
return 0;
}
- 结果:可以看到在服务器的所在路径下,创建了一个名为server的套接字类型的文件(可使用ls -lF查看)