(1) node15,node16为data server,node14为client端,在node14上安装了pvfs的内核模块,启动了pvfs2-client、pvfs2-client-core,将tcp://node15:3334/pvfs2-fs挂载到/mnt/pvfs2
(2) server.c (以node14为socket的server端,接收文件,并写入/mnt/pvfs2/中)
[root@node14 socket]# cat server.c #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<sys/stat.h> #include<fcntl.h> #include<time.h> #include<errno.h> #define oops(msg) { perror(msg); exit(errno); } int main(){ int sd = socket(PF_INET, SOCK_STREAM, 0); if(sd == -1) oops("socket"); struct sockaddr_in address; bzero((void *)&address, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr("192.168.100.123"); address.sin_port = 8888; int bind_return = bind(sd, (struct sockaddr *)&address, sizeof(address)); if(bind_return == -1) oops("bind"); int listen_return = listen(sd, 1); if(listen_return == -1) oops("listen"); while(1){ int client_fd = accept(sd, NULL, NULL); if(client_fd == -1) oops("accept"); time_t current_time = time(NULL); char fileName[50]; sprintf(fileName, "/mnt/pvfs2/%x", current_time); int fd = open(fileName, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR); if(fd == -1) oops("open"); char buff[1024]; ssize_t length; while((length = recv(client_fd, buff, sizeof(buff), 0)) > 0){ write(fd, buff, length); } close(fd); } return EXIT_SUCCESS; }(3) client.c (在任何一台linux机器上,作为socket的client端,向node14发文件)
[root@node15 socket]# cat client.c #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<sys/sendfile.h> #include<netinet/in.h> #include<arpa/inet.h> #include<sys/stat.h> #include<fcntl.h> #include<errno.h> #define oops(msg) { perror(msg); exit(errno); } int main(int argc, char *argv[]){ if(argc != 2)oops("which file not specified?"); int sd = socket(PF_INET, SOCK_STREAM, 0); if(sd == -1) oops("socket"); struct sockaddr_in address; bzero(&address, sizeof(address)); address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr("192.168.100.123"); address.sin_port = 8888; int connect_ret = connect(sd, (struct sockaddr*)&address, sizeof(address)); if(connect_ret == -1) oops("connect"); int fd = open(argv[1], O_RDONLY); off_t offset = 0; struct stat fileStatus; int fstat_ret = fstat(fd, &fileStatus); if(fstat_ret == -1)oops("fstat"); ssize_t length = sendfile(sd, fd, &offset, fileStatus.st_size); if(length == -1) {oops("sendfile");} else fprintf(stdout, "%ld characters have been send to server.", length); close(fd); close(sd); return EXIT_SUCCESS; }(4) 结果显示:
大文件被分块写入到node15、node16的/pvfs2-storage-space/中。