-----原理:
文件传输的原理其实很简单,服务端先在某个端口监听,等待客户端的连接,连接成功后,服务端打开指定的文件,然后读取文件,再通过创建的套接字发送给客户端。如果要实现一个服务端能与多个客户端连接,则需要用到多线程,下面给出一对一的实现代码,有兴趣的朋友可以用多线程实现一对多。
-----程序代码:
//fileserver.cc #include <iostream> #include <stdio.h> #include <strings.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> using namespace std; //./fileserver 2000 hahaya.txt 其中2000为端口号,hahaya.txt为文件名 int main(int argc, char *argv[]) { int sk = socket(AF_INET, SOCK_STREAM, 0); if(sk == -1) { cout << "create socket failed..." << endl; return 0; } struct sockaddr_in serveraddr; bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(atoi(argv[1])); serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sk, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) != 0) { cout << "bind failed..." << endl; close(sk); return 0; } listen(sk, 5); struct sockaddr_in clientaddr; bzero(&clientaddr, sizeof(clientaddr)); size_t len = sizeof(clientaddr); int talk = accept(sk, (struct sockaddr*)&clientaddr, &len); //打开文件并准备发送 cout << "server ready..." << endl; FILE *fp = fopen(argv[2], "r+"); int size = 0; char buff[1024] = {'\0'}; while((size = fread(buff, 1, sizeof(buff), fp)) > 0) { cout << "file sending..." << endl; send(talk, buff, size, 0); } cout << "send success..." << endl; fclose(fp); close(talk); close(sk); return 0; } //fileclient.cc #include <iostream> #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> using namespace std; //./clientserver 192.168.0.1 2000 hahaya.txt int main(int argc, char *argv[]) { int sk = socket(AF_INET, SOCK_STREAM, 0); if(sk == -1) { cout << "create socket failed..." << endl; return 0; } struct sockaddr_in serveraddr; bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(atoi(argv[2])); serveraddr.sin_addr.s_addr = inet_addr(argv[1]); connect(sk, (struct sockaddr*)&serveraddr, sizeof(serveraddr)); FILE *fp = fopen(argv[3], "w+"); char buff[1024] = {'\0'}; int len = 0; cout << "begin recv..." << endl; while((len = recv(sk, buff, sizeof(buff), 0)) > 0) { cout << "file recv..." << endl; fwrite(buff, 1, len, fp); } cout << "file success..." << endl; close(sk); fclose(fp); return 0; }
-----程序运行:
开启服务端: ./fileserver 2000 ./eclipse.zip
开启客户端: ./fileclient 192.168.254.128 2000 ./test.zip
传输完成后的test.zip文件可以解压,传输成功。