程序设计---一个淘宝小程序模拟()

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <string.h>
#include <time.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sqlite3.h>

int t = 0;
typedef struct sockaddr* (SA);
typedef enum {FILE_HTML,FILE_JPG,FILE_PNG,FILE_ICON}FILE_TYPE;

int send_head(int conn,char* filename,FILE_TYPE t)   //发送报头头
{

    struct stat st;
    int ret = stat(filename,&st);
    if(-1 == ret)
    {
        perror("stat");
        fprintf(stderr,"send file stat filename %s\n",filename);
        return 1;
    }
    char buf[128]={0};

    char * http_cmd[6]={NULL};
    http_cmd[4]=buf;
    http_cmd[0]="HTTP/1.1 200 OK\r\n";             //状态行
    http_cmd[1]="Date: Wed, 17 Jul 2024 06:18:27 GMT\r\n"; //时间
    switch(t)
    {
        case FILE_HTML:
        http_cmd[2]="Content-Type: text/html;charset=utf-8\r\n";         //回复内容的文件类型
        break;
        case FILE_JPG:
        http_cmd[2]="Content-Type: image/jpeg\r\n";         //回复内容的文件类型
        break;
        case FILE_PNG:
        http_cmd[2]="Content-Type: image/png\r\n";         //回复内容的文件类型
        break;
        case FILE_ICON:
        http_cmd[2]="Content-Type: image/jpeg\r\n";         //回复内容的文件类型
        break;
    }
    http_cmd[3]="Server: myserver\r\n";               //ngnix
    sprintf(http_cmd[4],"Content-Length: %ld\r\n",st.st_size);             //文件的大小
    http_cmd[5]="Connection: closed\r\n\r\n";            //短链接 

    int i =0;
    for(i=0;i<6;i++)
    {
        send(conn,http_cmd[i],strlen(http_cmd[i]),0);
    }
    return 0;
}

int send_file(int conn,char*filename,FILE_TYPE type)   //发送报文内容
{
    send_head(conn,filename,type);
    int fd = open(filename,O_RDONLY);
    if(-1 ==fd)
    {
        perror("open");
        return 1;
    }
    while(1)
    {
        char buf[512]={0};
        int rd_ret = read(fd,buf,sizeof(buf));
        if(rd_ret<=0)
        {
            break;
        }
        send(conn,buf,rd_ret,0);
    }
    close(fd);
    return 0;
}
int server_destroy(sqlite3* db) //关闭db数据库aaa
{
    sqlite3_close(db);
}
int server_init(sqlite3**db)     //初始化打开数据库
{
    int ret = sqlite3_open("./aaa.db",db);
    if(SQLITE_OK!=ret)
    {
        fprintf(stderr,"sql open %s\n",sqlite3_errmsg(*db));
        sqlite3_close(*db);
        return 1;
    }
}

int server_init2(sqlite3**db2)     //初始化数据库123
{
    int ret = sqlite3_open("./123.db",db2);
    if(SQLITE_OK!=ret)
    {
        fprintf(stderr,"sql open %s\n",sqlite3_errmsg(*db2));
        sqlite3_close(*db2);
        return 1;
    }
}
int show(void* arg,int col,char** result,char**titel) //找到内容设置1
{
    *(int*)arg = 1;
    return 0;
}
int find_name_pw(sqlite3* db,char *name,char* pw)   //去数据库aaa中找账号
{

    char sql_cmd[256]={0};
    sprintf(sql_cmd,"select name from user  where name like '%s' and pw ='%s';",name,pw);
    int flag = 0;
    char *errmsg ;
    int ret = sqlite3_exec(db,sql_cmd,show,&flag,&errmsg);
    if(SQLITE_OK !=ret)
    {
        fprintf(stderr,"sql exec sql:%s err:%s\n",sql_cmd,errmsg);
        sqlite3_free(errmsg);
        sqlite3_close(db);
        return 1;
    }
    return flag;

}

int try_reg(void* arg,int col,char** result,char**titel)  // 如果注册过了 
{
	int i = 0;
	if(result[i] > 0)
	{
		arg = result[i];
	}
	return 0 ;
}

void reg_user(int conn, char* name ,char* pw,sqlite3*db)   //注册账号
{
	char find_cmd[256];
	sprintf(find_cmd,"select count(*) from user where name like \"%s\";",name);
	char * errmsg1;
	static int try = 0;
	int ret1 = sqlite3_exec(db,find_cmd,try_reg,&try,&errmsg1);
	if(SQLITE_OK != ret1)
	{
		fprintf(stderr,"exec sqlcmd error: %s\n",errmsg1);
		sqlite3_free(errmsg1);
		sqlite3_close(db);
		return ;
	}
	if(try == 0)
	{
		char sql_cmd[256];
		sprintf(sql_cmd,"insert into user values(NULL,'%s','%s');",name,pw);
		char* errmsg;
		int ret = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);
		if(SQLITE_OK != ret)
		{
			fprintf(stderr,"exec sqlcmd error: %s\n",errmsg);
			sqlite3_free(errmsg);
			sqlite3_close(db);
			return ;
		}
		send_file(conn,"./zcsuc.html",FILE_HTML);
	}
	if(try != 0)
	{
		send_file(conn,"./zcdef.html",FILE_HTML);
	}
}
unsigned char FromHex(unsigned char x)       //中文转码1
{
	if(0 == x ) return -1;
	unsigned char y;
	if(x>='A' &&x<='Z') y = x-'A'+10;
	else if(x>='a' &&x <='z') y = x-'a'+10;
	else if(x>='0' && x<='9') y = x-'0';

	return y;
}

int  urlDecode(  char* dest, const char* src) //中文转码2
{
	if(NULL ==src || NULL == dest)
	{
		return -1;

	}
	int len = strlen(src);
	int i =0 ;
	for(i = 0 ;i<len;i++)
	{

		if('+' == src[i]) strcat(dest,"");
		else if('%'==src[i])
		{
			//if(i+2len)return -1;
			unsigned char high = FromHex((unsigned char)src[++i]);
			unsigned char low = FromHex((unsigned char)src[++i]);
			unsigned char temp = high*16 +low;
			char temp2[5]={0};
			sprintf(temp2,"%c",temp);
			strcat(dest , temp2);
		}
	}
	return 0;
}

void write_head(int fd,char rec_sult[64][2048])  //发送页面去
{
	char head[2048] = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>find</title><style>html{background-image: url(shopping.jpg);background-size: cover;}</style></head>";
	char bodyh[64] = "<body>";
	char br[128] = "<br><br><br><br>";
	char from[256] = "<form align = 'center' action='search' method = 'post'>搜索:<input name='sousuo' type = 'text'><input type = 'submit'></form>";
	char body[2048*40] = "0";
	if(t == 0)
	{
		sprintf(body,"<h1 ><table  width=\"100%%\" cellpadding=\"100\"><tr><td align=\"left\"><img src =\"%s\"></td><td align=\"right\">%s</td><td  align=\"right\">%s</td><td  align=\"right\">%s</td></tr></table></h1>",rec_sult[19],rec_sult[3],rec_sult[11],rec_sult[18]);
		write(fd,head,strlen(head));
		write(fd,bodyh,strlen(bodyh));
		write(fd,br,strlen(br));
		write(fd,from,strlen(from));
		write(fd,body,strlen(body));
		t++;
	}
	else
	{
		char body[2048] = "0";
		sprintf(body,"<h1 ><table  width=\"100%%\" cellpadding=\"100\"><tr><td align=\"left\"><img src =\"%s\"></td><td align=\"right\">%s</td><td  align=\"right\">%s</td><td  align=\"right\">%s</td></tr></table></h1>",rec_sult[19],rec_sult[3],rec_sult[11],rec_sult[18]);
		write(fd,body,strlen(body));
	}
}

int show_phone(void* arg ,int col ,char**result ,char**title)  //展示搜索的手机信息
{
	int fd = *(int*) arg;
    int i = 0 ;
    static int flag = 0 ;
	char rec_sult[64][2048]= {0};
	for(i = 0 ;i<col;i++)
	{
		if(0x0==result[i]|| result[i]==NULL||strlen(result[i]) == 0)
		{
			strcpy(rec_sult[i],"              ");
		}else
		{
			strcpy(rec_sult[i],result[i]);
		}
	}
	write_head(fd,rec_sult);
    return 0;
}

int count_t(void* arg ,int col ,char**result ,char**title) 
{
	*(int*)arg = atoi(result[0]);
	return 0;
}

void chose_goods(int conn, char* sousuo,sqlite3*db2)   //处理搜索的手机类型
{
	int fd = open("new.html",O_WRONLY|O_CREAT|O_TRUNC,0666);
	if(fd == -1)
	{
		perror("open fail");
		return ;
	}
	void * arg;
	arg = &fd;
	static int cg = 0;
	char old_buf[128]="0";
	strcpy(old_buf,sousuo);
	char new_buf[128]={0};
	urlDecode(new_buf,old_buf);
	sprintf(new_buf,"%s%s",new_buf,old_buf+3*strlen(new_buf));
	char sql_cmd[512];
	char* errmsg1;


	sprintf(sql_cmd,"select count(*) from goods where goods_name like'%%%s%%';",new_buf);
	
	int ret1 = sqlite3_exec(db2,sql_cmd,count_t,&cg,&errmsg1);
	if(SQLITE_OK != ret1)
	{
		fprintf(stderr,"exec sqlcmd error: %s\n",errmsg1);
		sqlite3_free(errmsg1);
		sqlite3_close(db2);
		return ;
	}
	if(cg != 0)
	{
		cg = 0;
		bzero(sql_cmd,sizeof(sql_cmd));
		sprintf(sql_cmd,"select * from goods where goods_name like'%%%s%%';",new_buf);
		char* errmsg;
		int ret = sqlite3_exec(db2,sql_cmd,show_phone,arg,&errmsg);
		if(SQLITE_OK != ret)
		{
			fprintf(stderr,"exec sqlcmd error: %s\n",errmsg);
			sqlite3_free(errmsg);
			sqlite3_close(db2);
			return ;
		}

		char bodyh[64] = "<body>";
		char end[64] = "</html>";
		write(fd,bodyh,strlen(bodyh));
		write(fd,end,strlen(end));
		t = 0 ;
		close(fd);
		send_file(conn,"new.html",FILE_HTML);
	}
	else if(cg == 0)
	{
		close(fd);
		send_file(conn,"nofind.html",FILE_HTML);
	}
}

int main(int argc, const char *argv[])
{
	sqlite3* db;
	sqlite3* db2;
	server_init(&db);     //初始化数据库
	server_init2(&db2);     //初始化数据库
	int listfd = socket(AF_INET,SOCK_STREAM,0); //监听套接字
	if(-1 == listfd)
	{
		perror("socket");
		exit(1);
	}

	struct sockaddr_in ser,cli;
	bzero(&ser,sizeof(ser));
	bzero(&cli,sizeof(cli));
	ser.sin_family = AF_INET;
	ser.sin_port = htons(80);
	ser.sin_addr.s_addr = htonl(INADDR_ANY);
	int on = 1;
	setsockopt(listfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));
	int ret = bind(listfd,(SA)&ser,sizeof(ser));
	if(-1 == ret)
	{
		perror("bind");
		exit(1);
	}
	listen(listfd,3);
	socklen_t len = sizeof(cli);
	while(1)
	{
		int conn = accept(listfd,(SA)&cli,&len);
		if(-1 == conn)
		{
			perror("accept");
			continue;
		}
		char buf[1024]={0};
		int rd_ret = recv(conn,buf,sizeof(buf),0);
		if(rd_ret<=0)
		{
			close(conn);
			continue;
		}
		printf("%s\n",buf);
		fflush(stdout);
		//get / http/1.1
		char *method = NULL;
		char * url = NULL;
		char * ver = NULL;
		char *tmp = strstr(buf,"\r\n\r\n");
		method = strtok(buf," ");
		url = strtok(NULL," ");
		ver = strtok(NULL,"\r");
		if(0 == strcmp(url,"/"))
		{
			send_file(conn,"./登录.html",FILE_HTML);
		}
		if(0 ==strncmp(url+1,"login",5))
        {
            char *name=NULL;
            char * pw=NULL;
            char* end = NULL;
            char * start;
            if(0==strcmp(method,"POST"))
            {
                start = tmp;
            }
            else //get 
            {
                start = url;
            }
            
            name = index(start,'=');
            name+=1;
            end = index(name,'&');
            *end ='\0';
            pw = index(end+1,'=');
            pw+=1;
            if(find_name_pw(db,name,pw))
            {
				//进入下一级界面
				send_file(conn,"search.html",FILE_HTML);
            }
            else 
            {
				//没找到请注册
                send_file(conn,"./meizhaodao.html",FILE_HTML);
            }
		}
		if(0 ==strncmp(url+1,"zhuce",5))
        {
			send_file(conn,"./zhuce.html",FILE_HTML);
		}
		if(0 ==strncmp(url+1,"domake",6))
		{
            char *name=NULL;
            char * pw=NULL;
            char* end = NULL;
            char * start;
            if(0==strcmp(method,"POST"))
            {
                start = tmp;
            }
            else //get 
            {
                start = url;
            }
            name = index(start,'=');
            name+=1;
            end = index(name,'&');
            *end ='\0';
            pw = index(end+1,'=');
            pw+=1;
			reg_user(conn,name,pw,db);
		}
		if(0 ==strncmp(url+1,"search",6))
        {
            char * start;
            if(0==strcmp(method,"POST"))
            {
                start = tmp;
            }
            else //get 
            {
                start = url;
            }
			char * sousuo = NULL;
			sousuo=index(start,'=');
			sousuo +=1;
			sousuo = strtok(sousuo," ");
			chose_goods(conn,sousuo,db2);
//			printf("sousuo = %s\n",sousuo);
		}

		//当申请图片和图标的时候发图片和图标
		if(strstr(url,"jpg")|| strstr(url,"ico"))
        {
            send_file(conn,url+1,FILE_JPG);
        }
        if(strstr(url,"png"))
        {
            send_file(conn,url+1,FILE_PNG);
        }
        close(conn);
		}

	close(listfd);
    server_destroy(db);
    server_destroy(db2);
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值