本地通信样例
环境为Ubuntu20
服务器端代码:
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
//socket本地通信 基于 socket文件进行数据传递
#define SOCK_FILE "my.sock"
int main(int argc,char *argv[]){
printf("1.服务器 创建socket套接字...\n");
int sockfd = socket(AF_LOCAL,SOCK_DGRAM,0);
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);//socket文件
//绑定到物理内存时 创建socket文件
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;
}
if(rb == 0){
break;
}
if(strcmp(buf,"!quit")==0){
break;
}
printf("recv: %s\n",buf);
}
printf("4.服务器 读取数据完毕,关闭服务器!\n");
close(sockfd);
printf("5.删除套接字文件!\n");
unlink(SOCK_FILE);
return 0;
}
用户端代码:
/*************************************************************************
* File Name: 05localclient.c
* Author: unite
* Tel: 18758077967
* Created Time: 2022年09月05日 星期一 15时34分49秒
************************************************************************/
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#define SOCK_FILE "my.sock"
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);
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);
int len = strlen(buf);
if(buf[len-1] == '\n'){
--len;
buf[len] = '\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;
}
最终的结果:
可能出现的问题:
bind:Address already in use问题
解决方法:rm my.sock然后重启服务器客户端即可