服务器端:

#include<iostream>
#include<winsock2.h>
#include<stdlib.h>
#include<thread>
#include <mutex>
#include <Windows.h>
#include<mysql.h>#pragma  comment(lib,"ws2_32.lib")
#pragma comment(lib,"C:\\Program Files\\MySQL\\MySQL Server 5.7\\lib\\libmysql.lib")struct Library
{char  bookName[100];char  writerBook[100];char  bookId[100];char  flag[100];char studentName[100];char studentNumber[100];
};void addNewBook(SOCKET & sClient,MYSQL & mycont)
{ using std::cout;using std::endl;char sql_insert[2048];while (1)                       //实现循环添加{char buffer[1024];Library book;recv(sClient, buffer, sizeof(buffer), 0);if (buffer[0] == 'q'){cout << "quit" << endl;break;}memcpy(&book, buffer, sizeof(Library));             //将接受的内容转换为结构体形式sprintf(sql_insert, "insert into mytable(bookname,writerbook,bookid,flag) values(%s,%s,%s,'IN')", book.bookName, book.writerBook,book.bookId);                                                                         mysql_query(&mycont, sql_insert);}
}void seeAllBooks(SOCKET & sClient, MYSQL & mycont)
{using std::cout;using std::endl;MYSQL_RES * result;MYSQL_ROW sql_col = 0;mysql_query(&mycont,"select * from mytable");                //访问数据库result = mysql_store_result(&mycont);                        //存储上面命令的结果if (result){Library book;while (sql_col = mysql_fetch_row(result))                //将每一列的结果保存{   memcpy(book.bookName, sql_col[0], sizeof(book.bookName));memcpy(book.writerBook, sql_col[1], sizeof(book.writerBook));memcpy(book.bookId, sql_col[2], sizeof(book.bookId));memcpy(book.flag, sql_col[3], sizeof(book.flag));send(sClient, (char *)&book, sizeof(Library), 0);      //先将要发送的结构体内容整合为字符串形式再发送int t = 1000000;while (t > 0){t--;}}}send(sClient, "q", sizeof("q"), 0);}void borrowBook(SOCKET & sClient, MYSQL & mycont)
{using std::cout;char buffer[1024];char mysearch[100];Library book;MYSQL_RES * result;MYSQL_ROW sql_col = 0;recv(sClient, buffer, sizeof(buffer), 0);memcpy(&book, buffer, sizeof(Library));sprintf(mysearch, "select * from mytable where bookname = %s and bookid = %s", book.bookName, book.bookId);        //sprintf实现含变量的命令调用mysql_query(&mycont, mysearch);if (result = mysql_store_result(&mycont)){sql_col = mysql_fetch_row(result);memcpy(book.bookName, sql_col[0], sizeof(book.bookName));memcpy(book.writerBook, sql_col[1], sizeof(book.writerBook));memcpy(book.bookId, sql_col[2], sizeof(book.bookId));memcpy(book.flag, sql_col[3], sizeof(book.flag));send(sClient, (char *)&book, sizeof(Library), 0);recv(sClient, buffer, sizeof(buffer), 0);memcpy(&book, buffer, sizeof(Library));char para[1024];sprintf(para,"update mytable set flag = 'OUT',studentName = %s, studentNumber = %s where bookname = %s and bookid = %s", book.studentName, book.studentNumber, book.bookName,book.bookId);mysql_query(&mycont, para);}else{send(sClient, "q", sizeof("q"), 0);}
}void backBook(SOCKET & sClient, MYSQL & mycont)
{using std::cout;using std::endl;char buffer[1024];Library book;char mysearch[1024];MYSQL_RES * res;recv(sClient, buffer, sizeof(buffer), 0);memcpy(&book, buffer, sizeof(Library));char para[1024];sprintf(para, "update mytable set flag = 'IN',studentName = 'NULL',studentNumber = 'NULL' where bookid = %s and studentname = %s",book.bookId, book.studentName);mysql_query(&mycont, para);Sleep(1);
}void seeBackBook(SOCKET & sClient, MYSQL & mycont)
{using std::cout;using std::endl;char buffer[1024];Library book;char mysearch[1024];MYSQL_RES * res;MYSQL_ROW sql_col;sprintf(mysearch,"select * from mytable where flag = 'OUT'");mysql_query(&mycont, mysearch);res = mysql_store_result(&mycont);if (res){Library book;while (sql_col = mysql_fetch_row(res)){memcpy(book.bookName, sql_col[0], sizeof(book.bookName));memcpy(book.writerBook, sql_col[1], sizeof(book.writerBook));memcpy(book.bookId, sql_col[2], sizeof(book.bookId));memcpy(book.flag, sql_col[3], sizeof(book.flag));memcpy(book.studentName, sql_col[4], sizeof(book.studentName));memcpy(book.studentNumber, sql_col[5], sizeof(book.studentNumber));send(sClient, (char *)&book, sizeof(Library), 0);int t = 1000000;while (t > 0){t--;}}}send(sClient, "q", sizeof("q"), 0);               //终止条件
}void deleteBook(SOCKET & sClient, MYSQL & mycont)
{using std::cout;using std::endl;char buffer[1024];Library book;char mysearch[1024];recv(sClient, buffer, sizeof(buffer), 0);memcpy(&book, buffer, sizeof(Library));sprintf(mysearch, "delete from mytable where bookname = %s and bookid = %s", book.bookName, book.bookId);mysql_query(&mycont, mysearch);
}int functions(SOCKET & sClient)
{using std::cout;using std::cin;using std::endl;int retVal;const int BUF_SIZE = 64;char buf[BUF_SIZE];char sendBuf[BUF_SIZE];const char user[] = "root";const char pswd[] = "12345678";const char host[] = "localhost";const char database[] = "xiwenbase";unsigned int port = 3306;MYSQL mycont;MYSQL_RES * result;MYSQL_ROW sql_row;int res;mysql_init(&mycont);if (mysql_real_connect(&mycont, host, user, pswd, database, port, NULL, 0)){mysql_query(&mycont, "SET NAMES GBK");while (1){ZeroMemory(buf, BUF_SIZE);retVal = recv(sClient, buf, BUF_SIZE, 0);if (SOCKET_ERROR == retVal){cout << "对方已下线" << endl;closesocket(sClient);WSACleanup();return -1;}char c;c = buf[0];if (buf[0] == '0'){cout << "发送为空!" << endl;}switch (c){case '1':addNewBook(sClient,mycont); break;case '2':seeAllBooks(sClient, mycont); break;case '3':borrowBook(sClient, mycont); break;case '4':backBook(sClient, mycont); break;case '5':seeBackBook(sClient, mycont); break;case '6':deleteBook(sClient, mycont); break;}}}
}int main()
{using std::cout;using std::cin;using std::endl;using std::thread;  int retVal;SOCKET sServer;SOCKET sClient;WSAData wsd;SOCKADDR_IN servaddr;SOCKADDR_IN cliaddr;if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0){cout << "startup error!" << endl;return -1;}sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if (sServer == INVALID_SOCKET){cout << "socket failed!" << endl;WSACleanup();return -1;}servaddr.sin_family = AF_INET;servaddr.sin_port = htons((short)4999);servaddr.sin_addr.s_addr = INADDR_ANY;retVal = bind(sServer, (LPSOCKADDR)&servaddr, sizeof(servaddr));if (SOCKET_ERROR == retVal){cout << "bind error!" << endl;closesocket(sServer);WSACleanup();return -1;}retVal = listen(sServer, 1024);if (SOCKET_ERROR == retVal){cout << "listen error!" << endl;closesocket(sServer);WSACleanup();return -1;}while (1){int cliaddrlen = sizeof(cliaddr);sClient = accept(sServer, (sockaddr FAR*)&cliaddr, &cliaddrlen);if (INVALID_SOCKET == sClient){//cout << "accept error!" << endl;closesocket(sServer);WSACleanup();return -1;}thread t1(functions,sClient);                t1.detach();}closesocket(sServer);closesocket(sClient);WSACleanup();return 0;
}

客户机端:

#include<iostream>
#include <string>
#include<winsock2.h>
#include <iomanip>
#pragma comment(lib,"ws2_32.lib")using namespace std;struct Library
{char  bookName[100];char  writerBook[100];char  bookId[100];char  flag[100];char studentName[100];char studentNumber[100];
};void  show(SOCKET & sServet)
{Library book;cout << "                  ———————————————————" << endl;cout << "                  |      欢迎使用西文图书室管理系统!  |" << endl;cout << "                  |     1、添加新书" << '\t' << "2、查看书库    |" << endl;cout << "                  |     3、借阅图书" << '\t' << "4、归还图书    |" << endl;cout << "                  |     5、借书信息" << '\t' << "6、下架废书    |" << endl;cout << "                  ———————————————————" << endl;char c;cout << "请输入操作数字:" << endl;cin >> c;switch (c){case '1':{send(sServet, "1", strlen("1"), 0);while (1){          cout << "请输入要添加的书目名称、作者、书目编号(q退出)" << endl;cin >> book.bookName;if (book.bookName[0] == 'q'){send(sServet, "q", sizeof("q"), 0);break;}cin>> book.writerBook >> book.bookId;memcpy(book.bookName, book.bookName, sizeof(book.bookName));memcpy(book.writerBook, book.writerBook, sizeof(book.writerBook));memcpy(book.bookId, book.bookId, sizeof(book.bookId));send(sServet, (char *)&book, sizeof(Library), 0);}break;}case '2':{char buffer[1024];send(sServet, "2", strlen("2"), 0);cout << left << setw(6) << "书名" << setw(6) << "作者" << setw(10) << "书目编号" << setw(6) << "借阅状态" << endl;while (1){Library book;ZeroMemory(buffer, 1024);recv(sServet, buffer, sizeof(buffer), 0);if (buffer[0] == 'q'){cout << "显示完毕!" << endl;break;}memcpy(&book, buffer, sizeof(Library));cout << left << setw(6) << book.bookName << setw(6) << book.writerBook << setw(10) << book.bookId << setw(6) << book.flag << endl;}break;}case '3':{char buffer[1024];Library book;send(sServet, "3", strlen("3"), 0);cout << "请输入你要借阅的书籍的名称和书目编号:" << endl;cin >> book.bookName >> book.bookId;memcpy(book.bookName, book.bookName, sizeof(book.bookName));memcpy(book.bookId, book.bookId, sizeof(book.bookId));send(sServet, (char *)&book, sizeof(Library), 0);cout << "1" << endl;recv(sServet, buffer, sizeof(buffer), 0);if (buffer[0] == 'q'){cout << "查询失败!" << endl;break;}memcpy(&book, buffer, sizeof(Library));cout << left << setw(6) << "书名" << setw(6) << "作者" << setw(10) << "书目编号" << setw(6) <<"借阅状态"<< endl;cout << left << setw(6) << book.bookName << setw(6) << book.writerBook << setw(10) << book.bookId << setw(6) << book.flag<<endl;if (strcmp(book.flag, "OUT") == 0){cout << "对不起,该书已经被借阅!" << endl;break;}else{cout << "请输入您的姓名和学号:" << endl;cin >> book.studentName >> book.studentNumber;memcpy(book.studentName, book.studentName, sizeof(book.studentName));memcpy(book.studentNumber, book.studentNumber, sizeof(book.studentNumber));send(sServet, (char *)&book, sizeof(Library), 0);cout << "借阅成功!" << endl;}break;}case '4':{char buffer[1024];send(sServet, "4", strlen("4"), 0);Library book;cout << "请输入你要归还的图书编号和本人姓名:" << endl;cin >> book.bookId >> book.studentName;memcpy(book.bookId, book.bookId, sizeof(book.bookId));memcpy(book.studentName, book.studentName, sizeof(book.studentName));send(sServet, (char *)&book, sizeof(Library), 0);cout << "还书成功!欢迎下次使用!" << endl;break;}case '5':{char buffer[1024];send(sServet, "5", strlen("5"), 0);cout << left << setw(6) << "书名" << setw(6) << "作者" << setw(10) << "书目编号" << setw(10) << "借阅状态" << setw(10) << "借书人"<<setw(6) <<"学号"<< endl;while (1){Library book;ZeroMemory(buffer, 1024);recv(sServet, buffer, sizeof(buffer), 0);if (buffer[0] == 'q'){cout << "显示完毕!" << endl;break;}memcpy(&book, buffer, sizeof(Library));cout << left << setw(6) << book.bookName << setw(6) << book.writerBook << setw(10) << book.bookId << setw(10) << book.flag << setw(10) << book.studentName<<setw(6) <<book.studentNumber<< endl;}break;}case '6':{send(sServet, "6", strlen("6"), 0);cout << "请输入你要下架的图书名称和图书编号:" << endl;cin >> book.bookName >> book.bookId;memcpy(book.bookName, book.bookName, sizeof(book.bookName));memcpy(book.bookId, book.bookId, sizeof(book.bookId));send(sServet, (char *)&book, sizeof(Library), 0);cout << "下架成功!" << endl;break;}default:cout << "谢谢使用!" << endl;exit(0);}
}int main()
{const int BUF_SIZE = 64;WSADATA wsd;SOCKET sServer;SOCKADDR_IN servaddr;char buf[BUF_SIZE];char recvBuf[BUF_SIZE];int retVal;if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0){cout << "WSAStartup error!" << endl;return -1;}sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (INVALID_SOCKET == sServer){cout << "socket error!" << endl;WSACleanup();return -1;}servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");servaddr.sin_port = htons((short)4999);int servaddrlen = sizeof(servaddr);retVal = connect(sServer, (LPSOCKADDR)&servaddr, servaddrlen);if (SOCKET_ERROR == retVal){cout << "connect error!" << endl;WSACleanup();closesocket(sServer);return -1;}while (1){show(sServer);}closesocket(sServer);WSACleanup();return 0;
}

												

西文图书管理系统(C++、线程、网络socket、MYSQL)相关推荐

  1. c语言图书管理系统 - 链接数据库版(MySQL)

    大一常见作业 使用vs 2022编写,若使用dev c++可酌情修改(如scanf_s修改为scanf) 比较简陋,可自行修改 功能概述 管理员功能 添加书籍信息(会存入数据库内) 显示书籍信息 查找 ...

  2. [附源码]java毕业设计图书管理系统论文

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  3. LibManagementSys图书管理系统

    LibManagementSys 介绍 图书管理系统 开发环境 .net6.0 MySQL 5.7.26 提示 在使用时,需手动导入DataBase文件夹下单sql数据库文件 功能介绍 登录功能 支持 ...

  4. python下tkinter模块和mysql构建图书管理系统实验

    前言与准备 本次实验是大二数据库期末大作业,我采用的是python语言和mysql8.0.27制作的基于cs构架的数据库框架,由于之前从未了解过python语言,所以代码部分语言较为粗暴,未成年人请在 ...

  5. [mysql+qt] 图书管理系统

    关于乱码问题:         后来亲测加上qstringliteral有效,而官方给出的tr函数,似乎对中文没啥用 出现编码错误,如字符常量这些,是qt自身的问题,用记事本存为utf-8应该就好了. ...

  6. MYSQL JDBC图书管理系统

    两万字,博主辛辛苦苦给大家写的,在这里求个三连~~. JDBC编程 一.JDBC简介 二.准备工作 三.JDBC五毒神掌 3.1导入驱动包,创建DataBase实例 四.加入SQL版的数据库 4.1系 ...

  7. java毕业生设计大学生网络创业就业管理系统计算机源码+系统+mysql+调试部署+lw

    java毕业生设计大学生网络创业就业管理系统计算机源码+系统+mysql+调试部署+lw java毕业生设计大学生网络创业就业管理系统计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目 ...

  8. java计算机毕业设计图书管理系统源程序+mysql+系统+lw文档+远程调试

    java计算机毕业设计图书管理系统源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计图书管理系统源程序+mysql+系统+lw文档+远程调试 本源码技术栈: 项目架构:B/S架构 开 ...

  9. java计算机毕业设计Vue和mysql智能图书管理系统源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计Vue和mysql智能图书管理系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计Vue和mysql智能图书管理系统源码+mysql数据库+系统+lw文档+部 ...

最新文章

  1. 通过对代码进行调试讲解缓冲区溢出原理
  2. leecode_二叉树中序遍历
  3. lts安装 rust ubuntu_一起学Rust编程「1」:开发环境
  4. spock 集成测试_Spock 1.2 –轻松进行集成测试中的Spring Bean模拟
  5. 消息称Uber正洽谈出售旗下自动驾驶部门ATG给Aurora
  6. 剑指Offer之寻找二叉树下一个节点
  7. mysql触发器主机自动增长_三分钟带你分清 Mysql 和 Oracle 之间的误区
  8. linux进入pe系统,如何进入pe系统【解答办法】
  9. 马氏距离(Mahalanobis Distance)
  10. IOS 苹果公司开发者账号注册申请流程
  11. 程序员,怎样打造个人影响力?
  12. maven项目install报错:\target\surefire-reports for the individual test results
  13. 遥感影像镶嵌及实现(四)
  14. 某云盘下载工具(IDM,Aria2)速度测试
  15. mac下统计代码行数方法
  16. SpringMVC----ajax跨域请求
  17. ISP——DPC(Defective Pixel Correction)
  18. 网络时间协议(NTP)
  19. 什么是人月,如何简单估算人月
  20. 解读领跑全国的区块链发展“北京方案”:设专项基金,构建开源生态

热门文章

  1. 仰邦控制卡Python接口_仰邦控制卡二次开发中转义是什么意思?
  2. RFID 冷库仓库管理解决方案
  3. 如何将视频生成gif?学会这招视频转gif快速实现
  4. java hive和hbase整合,Hive入门3–Hive与HBase的整合
  5. android ios 录音功能,盘点:简单好用的录音APP有哪些?
  6. 以证书方式对接支付宝接口
  7. Dragonframe定格动画工具
  8. Python【2019年蓝桥杯省赛C++填空】
  9. iDesktopX瓦片检查工具使用方法
  10. 【Excel函数】Office 365 之Excel函数之Left函数