#include "header.h"
int main() {
umask(0);
int connfd = -1;//连接描述符
int listenfd = -1;//监听描述符
int fd = -1 ;//文件描述符
socklen_t clilen;//客户端套接字长度
SAI seraddr,cliaddr;//地址信息结构体
memset(&seraddr,0,sizeof(seraddr));
memset(&cliaddr,0,sizeof(cliaddr));
char rbuf[FILEMAXSIZE];//读缓存
char wbuf[FILEMAXSIZE];//写缓存
int flag ;//记录是下载还是上传 ‘0为下载,1为上传
int ret = 0;//记录读写文件数
if(0 > (listenfd = socket(AF_INET,SOCK_STREAM,0))) {
err_exit("socket");
}
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(8888);
seraddr.sin_addr.s_addr = htonl(INADDR_ANY);
int i = 1;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i));
if(0 > bind(listenfd,(struct sockaddr *)(&seraddr),sizeof(seraddr))) {
err_exit("bind");
}
if(0 > listen(listenfd,10)) {
err_exit("listen");
}
printf("=========服务器启动成功!=======\n");
printf("listening...\n");
clilen = sizeof(cliaddr);
do {
connfd = accept(listenfd,(struct sockaddr *)(&cliaddr),&clilen);
if(0 > connfd) {
err_exit("accept");
}
printf("clien ip is :%s, port is :%d \n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
do {
memset(&rbuf,0,sizeof(rbuf));
memset(&wbuf,0,sizeof(wbuf));
char upath[]="./file_server/";//上传路径
char *sfn = NULL;//文件名
if(0 > recv(connfd,rbuf,MAXSIZE,0)) {
err_exit("recv");
}
if(0 == strncmp(rbuf,"quit",4)){//********结束内循环
break;
} else if(0 == strncmp(rbuf,"list",4)) {//******获取所有文件信息
system("ls -al ./file_server/ > file_info.txt");
int fd = open("file_info.txt",O_RDONLY,NULL);
if(0 > fd) {
err_exit("open");
}
if(0 > read(fd,wbuf,FILEMAXSIZE)) {
err_exit("read");
}
if(0 > send(connfd,wbuf,strlen(wbuf)+1,0)) {
err_exit("send");
}
close(fd);
}else if(0 == strncmp(rbuf,"get",3)) {//********下载
flag = 0;
sfn = (rbuf+4);//提取文件名
sfn[strlen(sfn)-1] = 0;
strcat(upath,sfn);//链接路径
fd = open(upath,O_RDONLY,NULL);//打开文件
if(0 > fd) {
err_exit("open");
}
do {
if(0 > (ret = read(fd,wbuf,FILEMAXSIZE))) {
err_exit("read");
}
if(0 > send(connfd,wbuf,ret,0)) {
err_exit("send");
}
if(0 > recv(connfd,rbuf,MAXSIZE,0)) {
err_exit("recv");
}
if(FILEMAXSIZE != ret) {
printf("read file end!\n");
break;
}
}while(1);
close(fd);
printf("====%s:下载了文件:%s=====\n",inet_ntoa(cliaddr.sin_addr),sfn);
wrlog(inet_ntoa(cliaddr.sin_addr),sfn,flag);
} else if(0 == strncmp(rbuf,"put",3)) {//*******上传
flag = 1;
sfn = (rbuf+4);
sfn[strlen(sfn)-1] = 0;
strcat(upath,sfn);
if(0 > send(connfd,sfn,strlen(sfn)+1,0)) {
err_exit("send");
}
if(0 > recv(connfd,wbuf,FILEMAXSIZE,0)) {
err_exit("recv");
}
fd = open(upath, O_CREAT | O_TRUNC | O_RDWR ,0666);
if(0 > fd) {
err_exit("open");
}
if(0 > write(fd,wbuf,strlen(wbuf)-1)) {
err_exit("write");
}
if(0 > send(connfd,"上传成功!",sizeof("上传成功!"),0)) {
err_exit("send");
}
close(fd);
printf("====%s:上传了文件:%s=====\n",inet_ntoa(cliaddr.sin_addr),sfn);
wrlog(inet_ntoa(cliaddr.sin_addr),sfn,flag);
}
}while(0 != strncmp(rbuf,"quit",4));
}while(1);
close(listenfd);
close(connfd);
return 0;
}
//写日志函数
void wrlog(char *ip,char *sfn,int flag) {
char c;
int line = 0;
FILE *fp = freopen("./log/log.txt","a+",stdout);//打开日志文件,追加信息
if(NULL == fp) {
err_exit("freopen");
}
while (EOF != (c = fgetc(fp))) {
if (c == '\n') {
line++;
}
}
time_t myt = time(NULL);
struct tm *mytime = localtime(&myt);
if(0 == flag) {
printf("%d , %d年%d月%d日 %d:%d:%d ,%s:下载了文件:%s\n", ++line, mytime->tm_year + 1900,mytime->tm_mon + 1, mytime->tm_mday, mytime->tm_hour, mytime->tm_min, mytime->tm_sec,ip,sfn);
} else {
printf("%d , %d年%d月%d日 %d:%d:%d ,%s:上传了文件:%s\n", ++line, mytime->tm_year + 1900,mytime->tm_mon + 1, mytime->tm_mday, mytime->tm_hour, mytime->tm_min, mytime->tm_sec,ip,sfn);
}
fflush(stdout);
fclose(fp);
}