4.35本地套接字通信

server:
/*// 本地套接字通信的流程 - tcp// 服务器端1. 创建监听的套接字 int lfd = socket(AF_UNIX/AF_LOCAL, SOCK_STREAM, 0);2. 监听的套接字绑定本地的套接字文件 -> server端struct sockaddr_un addr;// 绑定成功之后,指定的sun_path中的套接字文件会自动生成。bind(lfd, addr, len);3. 监听listen(lfd, 100);4. 等待并接受连接请求struct sockaddr_un cliaddr;int cfd = accept(lfd, &cliaddr, len);5. 通信接收数据:read/recv发送数据:write/send6. 关闭连接close();// 客户端的流程1. 创建通信的套接字int fd = socket(AF_UNIX/AF_LOCAL, SOCK_STREAM, 0);2. 监听的套接字绑定本地的IP 端口struct sockaddr_un addr;// 绑定成功之后,指定的sun_path中的套接字文件会自动生成。bind(lfd, addr, len);3. 连接服务器struct sockaddr_un serveraddr;connect(fd, &serveraddr, sizeof(serveraddr));4. 通信接收数据:read/recv发送数据:write/send5. 关闭连接close();// 头文件: sys/un.h#define UNIX_PATH_MAX 108struct sockaddr_un {sa_family_t sun_family; // 地址族协议 af_localchar sun_path[UNIX_PATH_MAX]; // 套接字文件的路径, 这是一个伪文件, 大小永远=0};
*/
#include
#include
#include
#include
#include
#includeint main(){unlink("server.sock");//1.创建监听的套接字int lfd = socket(AF_LOCAL,SOCK_STREAM,0);if(lfd == -1){perror("socket");exit(-1);}//2.绑定本地套接字文件struct sockaddr_un addr;addr.sun_family = AF_LOCAL;strcpy(addr.sun_path,"server.sock");int ret = bind(lfd,(struct sockaddr*)&addr,sizeof(addr));if(ret == -1){perror("bind");exit(-1);}//3.监听ret = listen(lfd,100);if(ret == -1){perror("listen");exit(-1);}//4.等待客户端连接struct sockaddr_un cliaddr;int len = sizeof(cliaddr);int cfd = accept(lfd,(struct sockaddr*)&cliaddr,&len);if(cfd==-1){perror("accept");exit(-1);}printf("client socket filename:%s\n",cliaddr.sun_path);//5.通信while(1){char buf[128];int len = recv(cfd,buf,sizeof(buf),0);if(len==-1){perror("recv");exit(-1);}else if(len==0){printf("client closed...\n");break;}else if(len>0){printf("client say : %s\n",buf);send(cfd,buf,len,0);}}close(cfd);close(lfd);return 0;
}
client:
#include
#include
#include
#include
#include
#includeint main(){unlink("client.sock");//1.创建套接字int cfd = socket(AF_LOCAL,SOCK_STREAM,0);if(cfd == -1){perror("socket");exit(-1);}//2.绑定本地套接字文件struct sockaddr_un addr;addr.sun_family = AF_LOCAL;strcpy(addr.sun_path,"client.sock");int ret = bind(cfd,(struct sockaddr*)&addr,sizeof(addr));if(ret == -1){perror("bind");exit(-1);}//3.连接服务器struct sockaddr_un seraddr;seraddr.sun_family = AF_LOCAL;strcpy(seraddr.sun_path,"server.sock");ret = connect(cfd,(struct sockaddr*)&seraddr,sizeof(seraddr));if(ret == -1){perror("connect");exit(-1);}//4.通信int num=0;while(1){//发送数据char buf[128];sprintf(buf,"hello,i am client %d\n",num++);send(cfd,buf,strlen(buf)+1,0);printf("client say : %s\n",buf);//接收数据int len = recv(cfd,buf,sizeof(buf),0);if(len==-1){perror("recv");exit(-1);}else if(len==0){printf("server closed...\n");break;}else if(len>0){printf("server say : %s\n",buf);}sleep(1);}close(cfd);return 0;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
