-----原理:
文件传输的原理其实很简单,服务端先在某个端口监听,等待客户端的连接,连接成功后,服务端打开指定的文件,然后读取文件,再通过创建的套接字发送给客户端。如果要实现一个服务端能与多个客户端连接,则需要用到多线程,下面给出一对一的实现代码,有兴趣的朋友可以用多线程实现一对多。
-----程序代码:
//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文件可以解压,传输成功。