#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;
}
07-16
1750
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交