功能实现
基于socket文件,进行数据传递,实现服务器与客户端之间进行本地通信
设计思路
服务器
- 创建socket套接字
- 将socket套接字关联到socket文件,实现绑定并创建套接字文件
- 此时,服务器就可以循环接收客户端发送的数据了
- 数据读取完毕,关闭服务器
- 删除套接字文件
客户端
- 创建socket套接字
- 连接到服务器的socket通信地址
- 此时,客户端就可以循环发送数据给服务器了
- 数据发送完毕,关闭客户端
代码实现
服务器代码
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <unistd.h>
/*
** 本地通信——基于socket文件进行数据传递
*/
// 服务器
#define SOCK_FILE "my.sock" // 定义存储的socket文件名
int main(int argc,char *argv[]){
printf("1. 服务器 创建socket套接字...\n");
int sockfd = socket(AF_LOCAL,SOCK_DGRAM,0); // UDP协议
if( sockfd == -1)
{
perror("socket");
return -1;
}
printf("2. socket套接字关联到socket文件...\n");
struct sockaddr_un addr; // 本地通信地址类型
addr.sun_family = AF_LOCAL; // 地址簇
strcpy(addr.sun_path,SOCK_FILE);
// 绑定到物理内存,创建套接字文件
int ret = bind(sockfd,(struct sockaddr*)&addr,sizeof(addr));
if( ret != 0 )
{
perror("bind");
return -1;
}
printf("3. 服务器循环接收数据...\n");
for(;;)
{
char buf[1024] = {};
ssize_t rb = read(sockfd,buf,sizeof(buf));
if(rb == -1)
{
perror("read");
return -1;
}
// 当客户端发送"!quit"关闭时,即结束循环
if(rb == 0 || strcmp(buf,"!quit")==0)
break;
printf("receive: %s\n",buf);
}
printf("4. 服务器读取数据完毕,关闭服务器...\n");
close(sockfd);
printf("5. 删除套接字文件!\n");
unlink(SOCK_FILE);
return 0;
}
客户端代码
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <unistd.h>
int main(int argc,char *argv[]){
printf("1. 客户端创建套接字...\n");
int sockfd = socket(AF_LOCAL,SOCK_DGRAM,0);
if(sockfd == -1)
{
perror("socket");
return -1;
}
printf("2. 客户端连接到服务器socket通信地址...\n");
struct sockaddr_un addr;
addr.sun_family = AF_LOCAL;
strcpy(addr.sun_path,SOCK_FILE);
// 请求连接,让socket套接字连接到服务器的通信地址
int ret = connect(sockfd,(const struct sockaddr*)&addr,sizeof(addr));
if(ret != 0)
{
perror("connect");
return -1;
}
printf("3. 客户端循环发送数据...\n");
for(;;)
{
printf(">");
char buf[1024] = {};
fgets(buf,1024,stdin);
// 将获取到的换行符替换成'\0'
int len = strlen(buf);
if(buf[len-1] == '\n')
{
--len;
buf[len] = '\0';
}
int ret = 0;
// 发送数据
if((ret = write(sockfd,buf,len+1) )<0)
{
perror("write");
return -1;
}
if(ret = 0 || strcmp(buf,"!quit")==0)
break;
}
printf("4. 关闭客户端...\n");
close(sockfd);
return 0;
}
实现效果
客户端
服务器
创建的socket文件
创建的socket文件就是那个紫色的my.sock文件啦,不过在服务器正常退出时会删除