当前位置: 首页 > wzjs >正文

兰州建设一个网站多少钱乐清建网站公司哪家好

兰州建设一个网站多少钱,乐清建网站公司哪家好,WordPress外链自动转内链,山西企业模板建站练习: 将 epoll 服务器 客户端拿来用 客户端:写一个界面,里面有注册登录 服务器:处理注册和登录逻辑,注册的话将注册的账号密码写入数据库,登录的话查询数据库中是否存在账号,并验证密码是否正确…

 

练习:

将 epoll 服务器 客户端拿来用
客户端:写一个界面,里面有注册登录
服务器:处理注册和登录逻辑,注册的话将注册的账号密码写入数据库,登录的话查询数据库中是否存在账号,并验证密码是否正确
额外功能:客户端登录的时候,服务器向客户端发送一个验证码,只有验证码也正确的时候,才能登录成功·     

server.c 

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/epoll.h>
#include <sqlite3.h>
#include <errno.h>
#include <time.h>#define MAX_EVENTS 100typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;enum Type {TYPE_REGIST,TYPE_LOGIN,TYPE_CHAT
};typedef struct Pack {enum Type type;char name[20];char pswd[20];char tarname[20];char text[1024];
} pack_t;sqlite3 *db;  // 数据库指针// 生成验证码
void generate_code(char *code, int length) {const char charset[] = "0123456789";srand(time(NULL));for (int i = 0; i < length; i++) {code[i] = charset[rand() % 10];}code[length] = '\0';
}// 设置文件描述符非阻塞模式
void set_nonblocking(int fd) {int flags = fcntl(fd, F_GETFL, 0);fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}// 处理客户端请求
void handle_client(int client) {pack_t pack = {0};int res = read(client, &pack, sizeof(pack));if (res <= 0) {printf("客户端断开连接\n");close(client);return;}char sql[256];char *errmsg = NULL;switch (pack.type) {case TYPE_REGIST:snprintf(sql, sizeof(sql), "INSERT INTO users (name, password) VALUES ('%s', '%s');", pack.name, pack.pswd);if (sqlite3_exec(db, sql, 0, 0, &errmsg) != SQLITE_OK) {printf("注册失败: %s\n", errmsg);strcpy(pack.text, "注册失败,该账号可能已存在!");sqlite3_free(errmsg);} else {strcpy(pack.text, "注册成功!");}write(client, &pack, sizeof(pack));break;case TYPE_LOGIN: {snprintf(sql, sizeof(sql), "SELECT password FROM users WHERE name = '%s';", pack.name);sqlite3_stmt *stmt;if (sqlite3_prepare_v2(db, sql, -1, &stmt, 0) == SQLITE_OK) {if (sqlite3_step(stmt) == SQLITE_ROW) {const char *db_pswd = (const char*)sqlite3_column_text(stmt, 0);if (strcmp(db_pswd, pack.pswd) == 0) {char code[6];generate_code(code, 5);snprintf(pack.text, sizeof(pack.text), "验证码:%s\n", code);write(client, &pack, sizeof(pack));// 等待客户端输入验证码read(client, &pack, sizeof(pack));if (strcmp(pack.text, code) == 0) {strcpy(pack.text, "登录成功!");} else {strcpy(pack.text, "验证码错误,登录失败!");}} else {strcpy(pack.text, "密码错误!");}} else {strcpy(pack.text, "账号不存在!");}sqlite3_finalize(stmt);}write(client, &pack, sizeof(pack));break;}case TYPE_CHAT:printf("收到消息: %s\n", pack.text);break;}
}int main(int argc, const char *argv[]) {if (argc != 2) {printf("请输入端口号\n");return 1;}int port = atoi(argv[1]);// 初始化数据库if (sqlite3_open("users.db", &db) != SQLITE_OK) {printf("无法打开数据库\n");return 1;}const char *create_table_sql = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT UNIQUE, password TEXT);";char *errmsg = NULL;if (sqlite3_exec(db, create_table_sql, 0, 0, &errmsg) != SQLITE_OK) {printf("创建表失败: %s\n", errmsg);sqlite3_free(errmsg);return 1;}// 创建服务器 socketint server = socket(AF_INET, SOCK_STREAM, 0);addr_in_t addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = INADDR_ANY;bind(server, (addr_t*)&addr, sizeof(addr));listen(server, 10);// 设置非阻塞模式set_nonblocking(server);// 创建 epollint epoll_fd = epoll_create1(0);struct epoll_event ev, events[MAX_EVENTS];ev.events = EPOLLIN;ev.data.fd = server;epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server, &ev);printf("服务器启动,监听端口 %d...\n", port);while (1) {int n = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);for (int i = 0; i < n; i++) {if (events[i].data.fd == server) {// 处理新连接int client = accept(server, NULL, NULL);if (client < 0) {perror("accept");continue;}set_nonblocking(client);ev.events = EPOLLIN | EPOLLET;ev.data.fd = client;epoll_ctl(epoll_fd, EPOLL_CTL_ADD, client, &ev);printf("新客户端连接: %d\n", client);} else {// 处理客户端请求handle_client(events[i].data.fd);}}}sqlite3_close(db);close(server);return 0;
}

client.c

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;enum Type {TYPE_REGIST,TYPE_LOGIN,TYPE_CHAT
};typedef struct Pack {enum Type type;char name[20];char pswd[20];char tarname[20];char text[1024];
} pack_t;void handle_response(int client) {pack_t pack;int res = read(client, &pack, sizeof(pack));if (res > 0) {printf("服务器: %s\n", pack.text);}
}int main(int argc, const char *argv[]) {if (argc != 2) {printf("输入端口号\n");return 1;}int port = atoi(argv[1]);int client = socket(AF_INET, SOCK_STREAM, 0);addr_in_t addr = {0};addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.s_addr = inet_addr("192.168.126.245");if (connect(client, (addr_t*)&addr, sizeof(addr)) == -1) {perror("连接失败");return 1;}printf("连接服务器成功!\n");while (1) {int ch;printf("1: 注册\n2: 登录\n3: 聊天\n0: 退出\n请选择: ");scanf("%d", &ch);while (getchar() != '\n');pack_t pack = {0};switch (ch) {case 1:printf("输入账号: ");scanf("%s", pack.name);while (getchar() != '\n');printf("输入密码: ");scanf("%s", pack.pswd);while (getchar() != '\n');pack.type = TYPE_REGIST;write(client, &pack, sizeof(pack));handle_response(client);break;case 2:printf("输入账号: ");scanf("%s", pack.name);while (getchar() != '\n');printf("输入密码: ");scanf("%s", pack.pswd);while (getchar() != '\n');pack.type = TYPE_LOGIN;write(client, &pack, sizeof(pack));handle_response(client); // 服务器发送验证码printf("输入验证码: ");scanf("%s", pack.text);while (getchar() != '\n');write(client, &pack, sizeof(pack));handle_response(client); // 登录成功 or 失败break;case 3:printf("输入聊天对象: ");scanf("%s", pack.tarname);while (getchar() != '\n');printf("输入消息: ");fgets(pack.text, sizeof(pack.text), stdin);pack.text[strcspn(pack.text, "\n")] = '\0'; // 去除换行符pack.type = TYPE_CHAT;write(client, &pack, sizeof(pack));handle_response(client);break;case 0:close(client);return 0;default:printf("无效选项\n");}}return 0;
}


文章转载自:

http://AxsaJbXf.qmbgb.cn
http://Mj6T7EiW.qmbgb.cn
http://7pe4M9jv.qmbgb.cn
http://voIssZw5.qmbgb.cn
http://xav86JpM.qmbgb.cn
http://mD5rBPVh.qmbgb.cn
http://EgqGh8El.qmbgb.cn
http://h38Tvcji.qmbgb.cn
http://wcoaWsEn.qmbgb.cn
http://kdSk9FTl.qmbgb.cn
http://NqvYYhyy.qmbgb.cn
http://gOwAiHBr.qmbgb.cn
http://Lk10DRbC.qmbgb.cn
http://Huxp4GjG.qmbgb.cn
http://mCQJnKNO.qmbgb.cn
http://LBG66DXE.qmbgb.cn
http://WsCrkry6.qmbgb.cn
http://G5JCdKHi.qmbgb.cn
http://vQrnUPse.qmbgb.cn
http://A32H66kM.qmbgb.cn
http://XMZexH61.qmbgb.cn
http://1n1FWEtz.qmbgb.cn
http://MI97yzs3.qmbgb.cn
http://Glh5E15T.qmbgb.cn
http://tiHluamC.qmbgb.cn
http://CMulvAMU.qmbgb.cn
http://V9hhI0Fq.qmbgb.cn
http://1YO1VDJt.qmbgb.cn
http://JSAL4LQM.qmbgb.cn
http://ibXmM7fR.qmbgb.cn
http://www.dtcms.com/wzjs/718951.html

相关文章:

  • 酒水招商网站大全关于网站制作的指标
  • 广东企业网站建设公司价格玩具网站模板
  • 京东网站设计代码天津大寺网站建设
  • 网站文档设置index.php自媒体发布平台
  • 网站设计登录界面怎么做贪玩原始传奇官方网站
  • 知识付费网站源码免费 开源 企业网站
  • 网站源码下载哪个网站好腾讯云云服务器官网
  • 邢台做移动网站的地方硬件开发工程师面试
  • 找网站公司制作网站广州哪个区封了
  • 苏州设置网站建设事业单位报名网站
  • 网站建设设计制作如何制作网站主页
  • 口碑好的大良网站建设家电维修 做网站还是搞公众号
  • 网站配色 蓝色哪个平台可以做推广
  • 设计网站免费大全衣服网站功能
  • 免费做网站手机免费查企业信息的平台
  • 室内设计网站模板图库素材网站
  • 东莞网站制作建设公司昆明网络推广方式有哪些
  • 佛山市平台购物网站制作公司metro网站模板
  • 企业营销型网站策划怎么做动漫原创视频网站
  • 网站留言系统 提交没反应营销型网站建设就找山东艾乎建站
  • 唐山做企业网站公司潍坊专业汽车贴膜
  • 建设网站用什么网络好了解网站建设管理
  • 河南做个人网站做食品网站有哪些东西
  • 网站建设论文百度云盘在线教育网站开发时长
  • 做类似于彩票的网站犯法吗wordpress国外全能主题推荐
  • 织梦cms电影网站源码网页开发模板
  • 响应式网站适合用什么框架做114啦网址导航建站系统
  • 深圳网站建设服务商哪些好?seo营销型网站
  • 淮阴区住房和城乡建设局网站关键词优化怎么做
  • wordpress文章模板插件泉州seo招聘