进程间通信-套接字 (文件服务器-下载服务器文件目录)
来源:互联网 发布:淘宝图片引是什么意思 编辑:程序博客网 时间:2024/05/21 10:14
服务器端
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/stat.h>#include <unistd.h>#include <errno.h>#include <dirent.h>#include <fcntl.h>#include <arpa/inet.h>#include <netinet/in.h>#include <string.h>#define errmes(mes) do{perror(mes);exit(1);}while(0)#define N 128int do_list(int acceptfd){ DIR *dir; struct dirent *dirp; char buf[N] = {}; if((dir = opendir(".")) == NULL) { errmes("fail to opendir"); } while((dirp = readdir(dir)) != NULL) //让dirp指向读到的目录文件 { if(dirp->d_name[0] == '.') //去掉隐藏文件 { continue; } strcpy(buf, dirp->d_name); //将目录结构体名字放入buf if(send(acceptfd, buf, N, 0) < 0) { errmes("fail to send"); } usleep(20); //避免粘包 } printf("目录文件已发送完毕\n"); close(acceptfd); return 0;}int main(int argc, const char *argv[]){ int sockfd, acceptfd; struct sockaddr_in serveraddr, clientaddr; socklen_t clientlen = sizeof(clientaddr); char buf[N] = {}; if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { errmes("fail to socket"); } serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = inet_addr(argv[1]); serveraddr.sin_port =htons(atoi(argv[2])); if(bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) { errmes("fail to bind"); } if(listen(sockfd, 10) < 0) { errmes("fail to listen"); } while(1) { if((acceptfd = accept(sockfd, (struct sockaddr *)&clientaddr, &clientlen)) < 0) { errmes("fail to accept"); } if(recv(acceptfd, buf, N, 0) < 0) { errmes("fail to recv"); } switch (buf[0]) { case 'L': do_list(acceptfd); break; default: printf("输入错素\n"); break; } } return 0;}
客户端
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/stat.h>#include <unistd.h>#include <errno.h>#include <dirent.h>#include <fcntl.h>#include <arpa/inet.h>#include <netinet/in.h>#include <string.h>#define errmes(mes) do{perror(mes);exit(1);}while(0)#define N 128int do_list(struct sockaddr_in serveraddr){ int sockfd; char buf[N] = {}; if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { errmes("fail to socket"); } if(connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr))) { errmes("fail to connect"); } strcpy(buf, "L"); if(send(sockfd, buf, N, 0) < 0) { errmes("fail to send"); } while(recv(sockfd, buf, N, 0) > 0) { printf("%s\n",buf); usleep(15); //防止粘包 } printf("目录文件已接收完毕\n"); close(sockfd); return 0;}int main(int argc, const char *argv[]){ struct sockaddr_in serveraddr; char buf[N] = {}; serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = inet_addr(argv[1]); serveraddr.sin_port =htons(atoi(argv[2])); fgets(buf, N, stdin); buf[strlen(buf) - 1] = '\0'; //由于fgets函数会将终端输入结束符“\n”也当做字符读入到数组中去, //所以要将数组最后一个元素“\n”替换成字符串结束符"\0", if(strncmp(buf, "list", 4) == 0) { do_list(serveraddr); } return 0;}
0 0
- 进程间通信-套接字 (文件服务器-下载服务器文件目录)
- web项目-文件下载(文件服务器-应用服务器-客户端)
- Linux 环境进程间通信(六) 套接字
- 进程间通信(六):unix域套接字
- Linux进程间套接字(Socket)通信
- Linux 环境进程间通信(六) 套接字
- 套接字(全双工)实现进程间通信
- IPC-进程间通信-套接字
- linux进程间通信--socket套接字
- linux进程间通信--域套接字
- linux进程间通信--socket套接字
- linux 进程间通信之套接字
- linux进程间通信--socket套接字
- tomcat 搭建文件服务器 下载目录和服务器分离
- URL下载文件服务器文件
- 【十二】进程间通信——[BSD]套接字(socket)
- Llinux进程间通信-AF_UNIX 套接字编程
- linux进程间通信--socket套接字 实例代码
- Java泛型详解
- Sevlet基础
- 关于div的问题
- 甲方安全工作二三事
- NOJ 题目2:括号配对问题
- 进程间通信-套接字 (文件服务器-下载服务器文件目录)
- 仿Tumblr点赞心破碎动画
- Booklist——ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛 A
- 刷题代码库及一些犯过错误
- Php程序猿必知的10个注意事项
- JAVA利用泛型返回类型不同的对象
- 【数据结构】树和二叉树
- js 如何调用另一个页面id 内容
- 微信小程序资源汇总整理