用linux实现一个模拟网盘:
功能1:实现网络客户端和服务端数据传送
功能2:实现文件下载
功能3:实现文件上传
功能4:实现并发服务器支持多个客户端同时下载或上传
功能5:用数据库保存用户信息和上传文件记录(文件编号 文件名 上传者等)
功能6:客户端只支持下载数据库记录中保存的文件
下面是c语言代码
服务端主函数
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <dirent.h>
#include "sqlite3.h"
#define SIZE 1024
#define PORT 8888
#define IP "127.0.0.1"
#define FILEPATH_MAX 80
char *pPath = "./clz";
sqlite3 *g_db = NULL;
char **pErrMsg = NULL;
char** ppTable = NULL;
int iRow = 0;
int iColumn = 0;
int main()
{
//创建流式套接字
int iSever=socket(AF_INET,SOCK_STREAM,0);
if(iSever<0)
{
perror("Socket error");
return -1;
}
printf("create socket ok!-----IServer=%d\n",iSever);
//绑定
struct sockaddr_in stServer;
memset(&stServer,0,sizeof(stServer));
stServer.sin_family=AF_INET;
stServer.sin_port=htons(PORT);
stServer.sin_addr.s_addr=inet_addr(IP);
int ret=bind(iSever,(struct sockaddr *)&stServer,sizeof(struct sockaddr));
if(ret<0)
{
perror("bind error");
return -1;
}
printf("bind ok\n");
//监听
ret=listen(iSever,5);
if(ret<0)
{
perror("listen error");
return -1;
}
printf("listen ok\n");
//接收
struct sockaddr_in stClient;
struct dirent *pt=NULL;
socklen_t len=sizeof(struct sockaddr_in);
char buf[SIZE]={0};
char buf2[SIZE]={0};
fd_set stFdr;//创建描述符集和表
FD_ZERO(&stFdr);//清空指定的描述符集和表 (原描述符集和表)
FD_SET(iSever,&stFdr);
int max=iSever;
//5.io (recv/send)
while(1)
{
struct sqlite3 *g_db = NULL;
fd_set stFdrTmp=stFdr;//临时描述符集和表
ret=select(max+1,&stFdrTmp,NULL,NULL,NULL);
if(ret<=0)
{
printf("select error\n");
continue;
}
printf("select ok,ret=%d\n",ret);
int i=0;
for(i=0;i<max+1;i++)
{
if(FD_ISSET(i,&stFdrTmp))
{
if(i==iSever)
{
int iClient=accept(iSever,(struct sockaddr *)&stClient,&len);
if(iClient<0)
{
continue;
}
printf("accept ok\n");
FD_SET(iClient,&stFdr);
if(max<iClient)
{
max=iClient;
}
}
else
{
//recv 指令down/upload
ret=recv(i,buf,SIZE,0);
if(ret>0)
{
printf("recv data ok:%s\n",buf);
if(strncmp(buf,"down",4)==0)
{
int re = sqlite3_open(pPath,&g_db);//连接数据库
if(re != SQLITE_OK)
{
printf("打开数据库失败!\n");
return SQLITE_OPEN_WAL;
}
printf("连接数据库成功!\n");
//执行查询并获取结果
char sqlSelect[] = "select * from test";
int iResult &