本地套接字
- 伪文件
- 即可采用TCP通信又可采用UDP通信
采用TCP通信流程如下
服务器端
-
创建套接字
int lfd=socket(AF_UNIX,SOCK_STREAM,0)
-
绑定一个套接字文件
struct sockaddr_un serv;
serv.sun_family=AF_UNIX;
strcpy(serv.sun_path,“server.socket”);------现在还不存在
bind(lfd,(struct sockaddr*)&serv,len);------绑定成功套接字文件被创建 -
设置监听
listen()
-
等待连接请求
struct sockaddr_un client;
int len=sizeof(client);
int cfd=accept(lfd,&client,&len); -
通信
send
recv -
断开连接
close(cfd);
close(lfd);
客户端
-
创建套接字
int lfd=socket(AF_UNIX,SOCK_STREAM,0)
-
绑定一个 套接字文件
struct sockaddr_un client;
client.sun_family=AF_UNIX;
strcpy(client.sun_path,“client.socket”);------现在还不存在
bind(lfd,(struct sockaddr*)&client,len);------绑定成功套接字文件被创建 -
连接服务器
struct sockaddr_un serv;
serv.sun_family=AF_UNIX;
strcpy(serv.sun_path,“server.socket”);------现在还不存在
bind(lfd,(struct sockaddr*)&serv,len);------绑定成功套接字文件被创建
connect(fd,&serv,sizeof(serv)); -
通信
send
recv
- 关闭连接
代码:
server.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<sys/un.h>
int main(int argc,const char * argc[])
{
int lfd=socket(AF_UNIX,SOCK_STREAM,0);
if(lfd==-1)
{
perror("socket error");
exit(1);
}
//如果套接字文件存在,删除套接字文件
unlink("server.sock");
//绑定
struct sockaddr_un serv;
serv.sun_family=AF_UNIX;
strcpy(serv.sun_path,"server.sock");------现在还不存在
int ret=bind(lfd,(struct sockaddr*)&serv,len);------绑定成功套接字文件被创建
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 len=sizeof(client);
int cfd=accept(lfd,(struct sockaddr*)&client,&len);
if(cfd==-1)
{
perror("accept error");
exit(1);
}
printf("client bind file:%s\n",client.sun_path);
//通信
while(1)
{
char buf[1024]={0};
int recvlen=recv(cfd,buf,sizeof(buf),0);
if(recvlen==-1)
{
perror("recv error");
exit(1);
}
else if(recvlen==0)
{
printf("client disconnect....");
close(cfd);
break;
}
else
{
printf("recv buf:%s\n",buf);
send(cfd,buf,recvlen,0);
}
}
close(cfd);
close(lfd);
return 0
}
client.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<sys/un.h>
int main(int argc,const char * argc[])
{
int fd=socket(AF_UNIX,SOCK_STREAM,0);
if(fd==-1)
{
perror("socket error");
exit(1);
}
//如果套接字文件存在,删除套接字文件
unlink("server.sock");
//绑定
struct sockaddr_un client;
serv.sun_family=AF_UNIX;
strcpy(serv.sun_path,"client.sock");------现在还不存在
int ret=bind(lfd,(struct sockaddr*)&client,len);------绑定成功套接字文件被创建
if(ret==-1)
{
perror("bind error");
exit(1);
}
struct sockaddr_un serv;
serv.sun_family=AF_UNIX;
strcpy(serv.sun_path,"server.sock");------现在还不存在
connect(fd,(struct sockadr*)&serv,sizeof(serv));
通信
while(1)
{
char buf[1024]={0};
fgets(buf,sizeof(buf),stdin);
//接收数据
recv(fd,buf,sizeof(buf),0);
printf("recv buf:%s\n",buf);
}
close(fd);
return 0;
}
编译执行后,关闭客户端,服务器端,重新执行会报地址被占用的错误
修改:rm serv.sock rm client.sock 再重新执行即可
方法二;代码 修改