文件系统套接字缺点:除非使用绝对路径名,否则该套接字会被创建在服务器所在目录下,并且需要将他创建在其他客户端都可访问的全局目录/tmp下,相比之下,网络套接字只需要使用一个未使用的端口即可
功能描述:客户端将字符A发送给服务器,服务器将字符A加1,将B回复给客户端,客户端打印结果
- 服务器ser.c
#include#include #include #include #include void server() { int sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if(sockfd == -1) { perror("socket err"); return; } struct sockaddr_un saddr; struct sockaddr_un caddr; saddr.sun_family = AF_UNIX; //清除该文件系统下的server文件 unlink("server"); strcpy(saddr.sun_path, "server"); int ret = bind(sockfd, (struct sockaddr*)&saddr, sizeof(saddr)); if(ret == -1) { perror("bind err"); return; } ret = listen(sockfd, 5); if(ret == -1) { perror("listen err"); return; } while(1) { char ch; printf("server waiting...n"); int len = sizeof(caddr); int csockfd = accept(sockfd, (struct sockaddr*)&caddr, &len); read(csockfd, &ch, 1); ch++; write(csockfd, &ch, 1); close(csockfd); } } int main() { server(); return 0; }
- 客户端cli.c
#include#include #include #include #include #include //适用于本地IPC的AF_UNIX void client() { //创建套接字 int sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if(sockfd == -1) return; struct sockaddr_un caddr; caddr.sun_family = AF_UNIX; strcpy(caddr.sun_path, "server"); int ret = connect(sockfd, (struct sockaddr*)&caddr, sizeof(caddr)); if(ret == -1) { perror("connect err"); return; } char ch = 'A'; write(sockfd, &ch, 1); read(sockfd, &ch, 1); printf("from ser ch : %cn", ch); close(sockfd); } int main() { client(); return 0; }
- 结果:可以看到在服务器的所在路径下,创建了一个名为server的套接字类型的文件(可使用ls -lF查看)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)