本质:文件的上传和下载本质实际上是对文件的读写操作
上传:将需要上传的文件名发给客户端然后将文件在客户端打开并循环读取至文件末尾,边读边写至和服务器建立的连接管道,服务器接收到文件名后创建一个同名文件,然后打开该文件将客户端写至连接管道的内容读出来并将其写入文件内。这即是文件的上传过程
下载:原理和文件上传类似,只是读写的顺序和目标调换一下
注意:怎样让服务器知道客户端是下载文件还是上传文件,需要客户端发送给服务器一个指令以便让服务器知道客户端想做什么,可以封装一个结构体,成员分别为指令和需要上传或者下载的文件名。
下面直接上代码,代码连在一块的,注释在代码里
服务器端:
头文件
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
tcp服务器封装
typedef struct fileinfo{
char filename[64];
int flag;//判断是下载还是上传指令
}f_info;
int serverinit()//服务器的封装
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror("sockfd");
return -1;
}
printf("%d\n",sockfd);
struct sockaddr_in saddr;
bzero(&saddr,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr("192.168.3.72");
saddr.sin_port = htons(8888);
int ret = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
if(ret < 0)
{
perror("bind&#