采用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 再重新执行即可
方法二;代码 修改