基于linux的模拟网盘

用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 &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值