文件格式:
○ 管道: p
○ 套接字
伪文件
头文件: sys/un.h
#define UNIX_PATH_MAX 108
__kernel_sa_family_t sun_family;
char sun_path[UNIX_PATH_MAX];
struct sockaddr_un {
};
服务器端
创建套接字socket
绑定bind
设置监听listen
等待接收连接请求accept
通信send/recv
断开连接close
客户端
创建套接字socket
绑定一个套接字文件bind
连接服务器connect
通信send/recv
断开连接close
server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <sys/stat.h>
#include <sys/un.h>
int main(int argc, char **argv)
{
int lfd = socket(AF_LOCAL, SOCK_STREAM, 0);
if (lfd == -1)
{
perror("socket error");
exit(1);
}
unlink("server.socket");
//绑定
struct sockaddr_un server;
server.sun_family = AF_LOCAL;
sprintf(server.sun_path, "%s", "server.socket");
int ret = bind(lfd, (struct sockaddr *)&server, sizeof(server));
if (ret == -1)
{
perror("bind error");
exit(1);
}
//监听
ret = listen(lfd, 128);
if (ret == -1)
{
perror("listen error");
exit(1);
}
//等待接收连接请求
struct sockaddr_un client;
socklen_t client_len = sizeof(client);
int cfd = accept(lfd, (struct sockaddr *)&client, &client_len);
if (cfd == -1)
{
perror("accept error");
exit(1);
}
printf("client server name : %s\n", client.sun_path);
//通信
while (1)
{
char buf[1024] = { 0 };
int len = recv(cfd, buf, sizeof(buf), 0);
if (len == -1)
{
perror("recv error");
exit(1);
}
else if (len == 0)
{
printf("客户端断开了连接\n");
break;
}
else
{
printf("recv buf : %s\n", buf);
send(cfd, buf, len, 0);
}
}
close(lfd);
close(cfd);
return 0;
}
client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <sys/stat.h>
#include <sys/un.h>
int main(int argc, char **argv)
{
//创建套接字
int fd = socket(AF_LOCAL, SOCK_STREAM, 0);
if (fd == -1)
{
perror("socket error");
exit(1);
}
unlink("client.socket");
//给客户端绑定套接字文件
struct sockaddr_un client;
client.sun_family = AF_LOCAL;
sprintf(client.sun_path, "%s", "client.socket");
int ret = bind(fd, (struct sockaddr *)&client, sizeof(client));
if (ret == -1)
{
perror("bind error");
exit(1);
}
//初始化服务器信息
struct sockaddr_un server;
server.sun_family = AF_LOCAL;
sprintf(server.sun_path, "%s", "server.socket");
//连接服务器
ret = connect(fd, (struct sockaddr *)&server, sizeof(server));
if (ret == -1)
{
perror("connect error");
exit(1);
}
//通信
while (1)
{
char buf[1024] = { 0 };
fgets(buf, sizeof(buf), stdin);
send(fd, buf, strlen(buf)+1, 0);
//接收数据
recv(fd, buf, sizeof(buf), 0);
printf("recv buf: %s\n", buf);
}
close(fd);
return 0;
}