基于Linux的socket网络编程项目——游侠手机商城

  • 一、项目说明
  • 二、项目使用的技术
  • 三、客户端搭建
  • 四、服务器端搭建

一、项目说明

本项目是一个仿真手机商城类系统,基本功能:
登录界面功能:用户、管理员双端登录,支持注册、找回密码、保存用户信息,支持检测用户登录状态,阻止双客户端同一用户同时登录。
用户界面功能:浏览商品、购买商品、查看仓库、查询余额与VIP等级/累计充值金额、余额充值,以及注销登录。
管理界面功能:添加手机、下架手机、修改手机价格、管理用户(可删除用户、限制用户登录、解除限制登录),以及注销登录。
代码如下,如需要源文件,请私信。

二、项目使用的技术

本项目使用技术:socket网络编程相关、sqlite3数据库、select IO多路复用、多进程通信。
注:数据库会保存在服务器端运行目录下,请注意。

三、客户端搭建

头文件

#ifndef _CLIENT_H_
#define _CLIENT_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include <sqlite3.h>#define SIZE 128typedef struct phone
{char pn[20];char sys_type[10];char cpu_type[10];char cmd[20];float price;int RAM_num;
}ph;typedef struct users
{char cmd[20];char ID[20];char password[10];char linecmd[10];float rem; //余额float historym;int viplevel;
}user;void sleep_1(unsigned int secs);
int login(int sockfd,user *s);
int creatlink(const char *argv[]);
int csendcmd(int sockfd,char *buf);
int csend(int sockfd,user s);
int csendp(int sockfd,ph iph);
int crecv(int sockfd);
int crecvp(int sockfd);
int userme(int sockfd,user s);
int manager(int sockfd,user s);
#endif

客户端主函数

#include "../include/client.h"int main(int argc,const char *argv[])
{while(1){user s;memset(&s,'\0',sizeof(user));if(argc != 3){printf("CMDLINE NOT EQUAL THREE!\n");return -1;}int sockfd = creatlink(argv);int log = login(sockfd,&s);if(log == 1){int man = userme(sockfd,s);if(man == 1){continue;}else{exit(0);}}else if(log == 2){int us1 = manager(sockfd,s);if(us1 == 1){continue;}else{exit(0);}}else if(log == 0){exit(0);}}return 0;
}

客户端登录

#include "../include/client.h"int login(int sockfd,user *s)
{user s1;memset(s,'\0',sizeof(user));memset(&s1,'\0',sizeof(user));printf("\n");printf("############游侠会员制手机商城##########\n");printf("****************欢迎使用****************\n");printf("1****************************** 用户登录\n");printf("2****************************** 管理登录\n");printf("3****************************** 用户注册\n");printf("4****************************** 找回密码\n");printf("5********************************** 退出\n");printf("请选择功能:");int menu = 0;if(1 !=scanf("%d",&menu)){printf("输入格式不正确\n");exit(-1);}switch(menu){case 1:{char buf[20] = {0};strcpy(buf,"readylogin\0");csendcmd(sockfd,buf);printf("输入用户名及密码\n");scanf("%s%*c%s",s->ID,s->password);csend(sockfd,*s);if(recv(sockfd,&s1,sizeof(user),0) < 0){perror("recv error");return -1;}if(!strcmp(s->ID,s1.ID) && !strcmp(s->password,s1.password) && 0 != strcmp(s1.cmd,"adminban\0") && 0 != strcmp(s1.linecmd,"online")){recv(sockfd,&s1,sizeof(user),0);strcpy(s->linecmd,"online\0");csend(sockfd,*s);printf("欢迎回来!尊敬的用户%s!\n",s->ID);return 1;}else if(0 == strcmp(s1.cmd,"adminban") && 0 != strcmp(s1.linecmd,"online\0")){recv(sockfd,&s1,sizeof(user),0);strcpy(s1.linecmd,"1\0");csend(sockfd,s1);printf("很抱歉 您因充值太少被禁止登录到2035年\n");login(sockfd,s);break;}else if(0 == strcmp(s1.ID,"nouser\0")){printf("用户名或密码错误 请重新输入\n\n");printf("忘记密码? 输入'4'进行找回\n");strcpy(s1.linecmd,"1\0");csend(sockfd,s1);login(sockfd,s);break;}else if(0 == strcmp(s1.linecmd,"online\0")){recv(sockfd,&s1,sizeof(user),0);strcpy(s1.linecmd,"1\0");csend(sockfd,s1);printf("用户已登录!\n");login(sockfd,s);break;}}case 2:{char buf[20] = {0};strcpy(buf,"readyadminlogin\0");csendcmd(sockfd,buf);printf("输入用户名及密码\n");scanf("%s%*c%s",s->ID,s->password);csend(sockfd,*s);if(recv(sockfd,&s1,sizeof(user),0) < 0){perror("recv error");return -1;}if(!strcmp(s->ID,s1.ID) && !strcmp(s->password,s1.password) && 0 != strcmp(s1.linecmd,"online")){recv(sockfd,&s1,sizeof(user),0);strcpy(s->linecmd,"online\0");csend(sockfd,*s);printf("\n");printf("欢迎回来!尊敬的管理员%s!\n",s->ID);return 2;}else if(0 == strcmp(s1.linecmd,"online\0")){recv(sockfd,&s1,sizeof(user),0);strcpy(s1.linecmd,"1\0");csend(sockfd,s1);printf("用户已登录!\n");login(sockfd,s);break;}else{strcpy(s1.linecmd,"1\0");csend(sockfd,s1);printf("用户名或密码错误 请重新输入\n\n");printf("管理员账户无法进行找回!请再试试\n");login(sockfd,s);break;}}case 3:{char buf[20] = {0};strcpy(buf,"readyregister\0");csendcmd(sockfd,buf);printf("输入要注册的用户名和密码:");scanf("%s%*c%s",s->ID,s->password);csend(sockfd,*s);recv(sockfd,&s1,sizeof(user),0);if(0 == strcmp(s1.ID,"nouser\0")){strcpy(s->linecmd,"notonline\0");strcpy(s->cmd,"usernormal\0");s->historym = 0;s->viplevel = 0;csend(sockfd,*s);printf("注册成功!开业大酬宾!赠送您10000余额!\n");login(sockfd,s);break;   }else{  printf("该用户已存在!\n");strcpy(s1.cmd,"userexit\0");csend(sockfd,s1);break;}}case 4:{char buf[20] = {0};strcpy(buf,"readychangepswd\0");csendcmd(sockfd,buf);printf("输入您要找回密码的用户名:");scanf("%s",s1.ID);csend(sockfd,s1);recv(sockfd,s,sizeof(user),0);if(0 == strcmp(s1.ID,s->ID)){recv(sockfd,s,sizeof(user),0);printf("输入您要更新的密码: ");scanf("%s",s1.password);csend(sockfd,s1);printf("密码修改成功!\n");login(sockfd,s);break;}else{csend(sockfd,*s);printf("该用户不存在!\n");login(sockfd,s);break;}}default:{printf("_______________#########_______________________\n");sleep_1(50);printf("______________############_____________________\n");sleep_1(50);printf("______________#############____________________\n");sleep_1(50);printf("_____________##__###########___________________\n");sleep_1(50);printf("____________###__######_#####__________________\n");sleep_1(50);printf("____________###_#######___####_________________\n");sleep_1(50);printf("___________###__##########_####________________\n");sleep_1(50);printf("__________####__###########_####_______________\n");sleep_1(50);printf("________#####___###########__#####_____________\n");sleep_1(50);printf("_______######___###_########___#####___________\n");sleep_1(50);printf("_______#####___###___########___######_________\n");sleep_1(50);printf("______######___###__###########___######_______\n");  sleep_1(50);printf("_____######___####_##############__######______\n");sleep_1(50);printf("____#######__#####################_#######_____\n");sleep_1(50);printf("____#######__##############################____\n");sleep_1(50);printf("___#######__######_#################_#######___\n");sleep_1(50);printf("___#######__######_######_#########___######___\n");sleep_1(50);printf("___#######____##__######___######_____######___\n");sleep_1(50);printf("___#######________######____#####_____#####____\n");sleep_1(50);printf("____######________#####_____#####_____####_____\n");sleep_1(50);printf("_____#####________####______#####_____###______\n");sleep_1(50);printf("______#####______;###________###______#________\n");sleep_1(50);printf("________##_______####________####______________\n");printf("欢迎下次再来!\n");close(sockfd);return 0;}}
}

用户界面(客户端send)

#include "../include/client.h"int userme(int sockfd,user s)
{while(1){ph iph,iph1;user s1;memset(&iph,'\0',sizeof(ph));memset(&iph1,'\0',sizeof(ph));memset(&s1,'\0',sizeof(user));printf("\n");printf("****************用户界面****************\n"); printf("1****************************** 浏览手机\n"); printf("2****************************** 购买手机\n");printf("3****************************** 浏览仓库\n");printf("4****************************** 查询余额\n");       printf("5****************************** 余额充值\n"); printf("6*********************** 了解VIP等级规则\n");printf("7****************************** 注销登录\n");printf("选择功能:");int me = 0;if(1 != scanf("%d",&me)){printf("输入的格式不正确\n");return 1;}switch(me){case 1:{char buf[20] = {0};strcpy(buf,"readycustomfind\0");csendcmd(sockfd,buf);printf("目前在售的所有手机如下所示:\n");crecv(sockfd);break;}case 2:{char buf[20] = {0};strcpy(buf,"readycustombuy\0");csendcmd(sockfd,buf);printf("输入你要购买的手机名称:");scanf("%s",iph1.pn);csendp(sockfd,iph1);recv(sockfd,&iph,sizeof(ph),0);if(0 == strcmp(iph1.pn,iph.pn)){float vip = 0;recv(sockfd,&iph1,sizeof(ph),0);csend(sockfd,s);recv(sockfd,&s,sizeof(user),0);recv(sockfd,&s1,sizeof(user),0);if(0 == s.viplevel){vip = 1;}else if(1 == s.viplevel){vip = 0.95;}else if(2 == s.viplevel){vip = 0.9;}else if(3 == s.viplevel){vip = 0.85;}else if(4 == s.viplevel){vip = 0.8;}printf("您要购买的手机为:%s 价格:%.1f\n",iph.pn,iph.price);printf("优惠后的价格为:%.1f\n",iph.price * vip);printf("确定购买吗?(y/n)\n");char a;getchar();scanf("%c",&a);if(a == 'y' || a == 'Y'){char buf[20] = {0};strcpy(buf,"readybuy\0");csendcmd(sockfd,buf);if(s.rem >= (iph.price * vip)){s.rem = s.rem - iph.price * vip;printf("购买后余额为:%.1f\n",s.rem);csend(sockfd,s);csendp(sockfd,iph);printf("手机已入库!\n");break;}else{strcpy(s1.cmd,"lackofbalance\0");csend(sockfd,s1);printf("您的余额不足,请充值!\n");break;}}if(a == 'n' || a == 'N'){printf("取消购买\n");break;}}else{strcpy(s1.cmd,"nophone\0");csend(sockfd,s1);printf("该型号手机不存在!\n");break;}}case 3:{char buf[20] = {0};strcpy(buf,"readywarehouse\0");csendcmd(sockfd,buf);printf("您已购买的手机如下所示:\n");csend(sockfd,s);crecv(sockfd);break;}case 4:{char buf[20] = {0};strcpy(buf,"readyrqnum\0");csendcmd(sockfd,buf);csend(sockfd,s);int re = recv(sockfd,&s,sizeof(s),0);if(re < 0){perror("recv error");exit(-1);}printf("尊敬的用户%s,您的余额为:%.1f\n",s.ID,s.rem);printf("您当前的累计充值金额为:%.1f,您的VIP等级为:VIP%d\n",s.historym,s.viplevel);recv(sockfd,&s1,sizeof(user),0);break;}case 5:{char buf[20] = {0};strcpy(buf,"readyaddmon\0");send(sockfd,&buf,sizeof(buf),0);printf("请输入要充值的金额: ");float mon = 0;scanf("%f",&mon);if(mon <= 0){printf("充值金额不正确!\n");continue;}printf("请输入充值卡密: ");char buf1[10] = {0};scanf("%s",buf1);if(0 == strcmp(buf1,"CDK\0")){csend(sockfd,s);recv(sockfd,&s,sizeof(user),0);recv(sockfd,&s1,sizeof(user),0);s.historym = s.historym + mon;if(s.historym >= 1000 && s.historym < 10000){s.viplevel = 1;}else if(s.historym >= 10000 && s.historym < 50000){s.viplevel = 2;}else if(s.historym >= 50000 && s.historym < 80000){s.viplevel = 3;}else if(s.historym >= 80000){s.viplevel = 4;}s.rem = s.rem + mon;csend(sockfd,s);recv(sockfd,&s,sizeof(user),0);recv(sockfd,&s1,sizeof(user),0);printf("充值成功!\n");printf("尊贵的用户%s,您当前余额为:%.1f,您的累计充值金额为:%.1f\n",s.ID,s.rem,s.historym);printf("您当前的VIP等级为:VIP%d\n",s.viplevel);break;}else{strcpy(s1.cmd,"cdknottrue\0");csend(sockfd,s1);printf("卡密不正确!\n");break;}}case 6:{printf("*********************VIP等级规则*********************\n");printf("VIP 0:白银会员(累充0-1000)-------------购物不享受折扣\n");printf("VIP 1:黄金会员(累充1000-10000)------购物享受9.5折优惠\n");printf("VIP 2:白金会员(累充10000-50000)-------购物享受9折优惠\n");printf("VIP 3:钻石会员(累充50000-80000)-----购物享受8.5折优惠\n");printf("VIP 4:黑金会员(累充80000以上)---------购物享受8折优惠\n");printf("*****************************************************\n");break;}case 7:{char buf[20] = {0};strcpy(buf,"readylogout\0");csendcmd(sockfd,buf);strcpy(s.linecmd,"notonline\0");csend(sockfd,s);printf("注销成功!\n");return 1;}}}
}

管理员界面(客户端send)

#include "../include/client.h"void sleep_1(unsigned int secs)
{struct timeval tval;tval.tv_sec=secs/1000;tval.tv_usec=(secs*1000)%1000000;select(0,NULL,NULL,NULL,&tval);
}int manager(int sockfd,user s)
{while(1){ph iph,iph1;user s1,s2;memset(&s1,'\0',sizeof(user));memset(&s2,'\0',sizeof(user));memset(&iph1,'\0',sizeof(ph));memset(&iph,'\0',sizeof(ph));printf("***************************管理界面***************************\n");printf("                   ,----------------,              ,---------,\n");sleep_1(50);printf("              ,-----------------------,          ,'        ,'|\n");sleep_1(50);printf("            ,'                      ,'|        ,'        ,'  |\n");sleep_1(50);printf("           +-----------------------+  |      ,'        ,'    |\n");sleep_1(50);printf("           |  .-----------------.  |  |     +---------+      |\n");sleep_1(50);printf("           |  |                 |  |  |     | -==----'|      |\n");sleep_1(50);printf("           |  | ARKNIGHT        |  |  |     |         |      |\n");sleep_1(50);printf("           |  | I sing ark song |  |  |/----|`---=    |      |\n");sleep_1(50);printf("           |  | C:\\>_           |  |  |   ,/|==== ooo |      ;\n");sleep_1(50);;printf("           |  |                 |  |  |  // |(((( [33]|    ,'\n");sleep_1(50);printf("           |  `-----------------'  |,' .;'| |((((     |  ,'\n");sleep_1(50);printf("           +-----------------------+  ;;  | |         |,'\n");sleep_1(50);printf("              /_)______________(_/  //'   | +---------+\n");sleep_1(50);printf("         ___________________________/___  `,\n");sleep_1(50);printf("        /  oooooooooooooooo  .o.  oooo /,   \\,'-----------\n");sleep_1(50);printf("       / ==ooooooooooooooo==.o.  ooo= //   ,`\\--{)B     ,'\n");sleep_1(50);printf("      /_==__==========__==_ooo__ooo=_/'   /___________,'\n");sleep_1(50);printf("\n");printf("1**************************************************** 添加手机\n");    printf("2**************************************************** 修改手机价格\n"); printf("3**************************************************** 下架手机\n");   printf("4**************************************************** 管理用户\n");   printf("5**************************************************** 注销登录\n");printf("选择功能:");int me = 0;if(1 != scanf("%d",&me)){printf("输入的格式不正确\n");return 0;}switch(me){case 1:{char buf[20] = {0};strcpy(buf,"readyaddp\0");csendcmd(sockfd,buf);printf("输入手机的名字、系统类型、CPU类型、内存大小和价格\n");{if(5 !=scanf("%s%*c%s%*c%s%d%f",iph1.pn,iph1.sys_type,iph1.cpu_type,&iph1.RAM_num,&iph1.price)){printf("输入格式不正确!\n");break;}}csendp(sockfd,iph1);printf("添加成功!\n");break;}case 2:{printf("所有在售手机的信息如下:\n");char buf1[20] = {0};strcpy(buf1,"readyadminfindp\0");csendcmd(sockfd,buf1);crecv(sockfd);char buf[20] = {0};strcpy(buf,"readyupdate\0");csendcmd(sockfd,buf);printf("输入要修改的手机型号\n");scanf("%s",iph1.pn);csendp(sockfd,iph1); //发送查找请求if(recv(sockfd,&iph,sizeof(ph),0) < 0){perror("recv error");exit(-1);}    if(0 == strcmp(iph.pn,iph1.pn)){recv(sockfd,&iph,sizeof(ph),0);printf("输入要修改的手机价格\n");scanf("%f",&iph1.price);csendp(sockfd,iph1);printf("修改价格成功\n");}else{csendp(sockfd,iph);printf("不存在此类型的手机\n");break;}break;}case 3:{char buf[20] = {0};strcpy(buf,"readydeletep\0");csendcmd(sockfd,buf);printf("输入要删除的手机型号:");scanf("%s",iph1.pn);csendp(sockfd,iph1);printf("删除成功\n");break;}case 4:{printf("所有用户的信息如下:\n");char buf1[20] = {0};strcpy(buf1,"readyadminfind\0");csendcmd(sockfd,buf1);crecvp(sockfd);char buf[20] = {0};strcpy(buf,"readycontral\0");csendcmd(sockfd,buf);printf("输入目标用户:");scanf("%s",s.ID);csend(sockfd,s);if(recv(sockfd,&s1,sizeof(user),0) < 0){perror("recv error");return -1;}s2 = s1;if(!strcmp(s.ID,s2.ID)){if(recv(sockfd,&s1,sizeof(user),0) < 0){perror("recv error");return -1;}    while(1){memset(&s1,'\0',sizeof(user));memset(&s2,'\0',sizeof(user));memset(&iph1,'\0',sizeof(ph));memset(&iph,'\0',sizeof(ph));printf("\n");printf("*******************管理界面*******************\n");    printf("1************************************ 删除用户\n");   printf("2************************************ 限制登录\n");   printf("3************************************ 解除限制\n");   printf("4**************************************** 返回\n"); int me = 0;printf("选择功能:");scanf("%d",&me);switch(me){case 1:{strcpy(s.cmd,"admindelete\0");printf("目标用户:%s\n",s.ID);printf("请确认删除(y/n):");char a;getchar();scanf("%c",&a);if(a == 'y' || a == 'Y'){char buf[20] = {0};strcpy(buf,"readyadmincon\0");csendcmd(sockfd,buf);csend(sockfd,s);printf("删除用户成功\n");break;}if(a == 'n' || a == 'N'){printf("取消操作\n");break;}}case 2:{strcpy(s.cmd,"adminban\0");printf("目标用户:%s\n",s.ID);printf("请确认操作 目标用户将无法登录(y/n):");char a;getchar();scanf("%c",&a);if(a == 'y' || a == 'Y'){char buf[20] = {0};strcpy(buf,"readyadmincon\0");csendcmd(sockfd,buf);csend(sockfd,s);printf("限制登录成功\n");break;}if(a == 'n' || a == 'N'){printf("取消操作\n");break;}}case 3:{strcpy(s.cmd,"adminisban\0");printf("目标用户:%s\n",s.ID);printf("请确认操作 目标用户将解除登录限制(y/n):");char a;getchar();scanf("%c",&a);if(a == 'y' || a == 'Y'){char buf[20] = {0};strcpy(buf,"readyadmincon\0");csendcmd(sockfd,buf);csend(sockfd,s);recv(sockfd,&s,sizeof(user),0);recv(sockfd,&s1,sizeof(user),0);csend(sockfd,s);recv(sockfd,&s,sizeof(user),0);if(0 == strcpy(s.cmd,"isbaned\0")){printf("解除登录限制成功\n");break;}else{printf("该用户没有被限制登录\n");break;}}if(a == 'n' || a == 'N'){printf("取消操作\n");break;}}case 4:{break;}}break;}}else if(0 == strcmp(s2.ID,"nouser\0")){printf("用户名不存在 请重新输入\n\n");break;}break;}case 5:{char buf[20] = {0};strcpy(buf,"readyadminlogout\0");csendcmd(sockfd,buf);strcpy(s.linecmd,"notonline\0");csend(sockfd,s);printf("注销登录成功\n");return 1;}} }return 0;
}

客户端recv子函数

#include "../include/client.h"int crecv(int sockfd)
{printf("手机名称\t系统类型\tCPU\t内存大小\t价格\n");while(1){ph iph;memset(&iph,'\0',sizeof(ph));int re = recv(sockfd,&iph,sizeof(iph),0);if(re < 0){perror("recv error");exit(-1);}if(0 == strcmp(iph.pn,"nophone\0")){return 0;  }printf("%s\t%s\t\t%s\t%d\t\t%.1f\n",iph.pn,iph.sys_type,iph.cpu_type,iph.RAM_num,iph.price);}return 0;
}int crecvp(int sockfd)
{printf("用户名\t用户密码    余额\t累计充值    VIP等级\t当前状态\t登录状态\n");while(1){user s;memset(&s,'\0',sizeof(user));int re = recv(sockfd,&s,sizeof(user),0);if(re < 0){perror("recv error");exit(-1);}if(0 == strcmp(s.ID,"nouser\0")){return 0; }printf("%s\t%s\t    %.1f\t%.1f\t    %d\t\t%s\t%s\n",s.ID,s.password,s.rem,s.historym,s.viplevel,s.cmd,s.linecmd);}return 0;
}

客户端send子函数

#include "../include/client.h"int csendcmd(int sockfd,char *buf)
{if(send(sockfd,buf,sizeof(char [20]),0) < 0){perror("send error");exit(-1);}
}int csend(int sockfd,user s)
{if(send(sockfd,&s,sizeof(user),0) < 0){perror("send error");exit(-1);}
}int csendp(int sockfd,ph iph)
{if(send(sockfd,&iph,sizeof(ph),0) < 0){perror("send error");exit(-1);}
}

四、服务器端搭建

头文件

#ifndef _CLIENT_H_
#define _CLIENT_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include <arpa/inet.h>
#include <sqlite3.h>#define SIZE 128typedef struct phone
{char pn[20];char sys_type[10];char cpu_type[10];char cmd[20];float price;int RAM_num;
}ph;typedef struct users
{char cmd[20];char ID[20];char password[10];char linecmd[10];float rem; //余额float historym;int viplevel;
}user;int login(int sockfd,user s);
int creatlink(const char *argv[]);
int ssendcmd(int sockfd,char *buf);
int ssend(int sockfd,user s);
int ssendp(int sockfd,ph iph);
int srecv(int sockfd,sqlite3 *db);
sqlite3 * sql_open(char * dbname);
int creat_table(sqlite3 *db,char *tbname);
int creat_utable(sqlite3 *db,char *tbname);
int insert_data(sqlite3 *db,char *tbname,ph iph);
int insert_udata(sqlite3 *db,char *tbname,user s);
int select_data(sqlite3 *db,char *tbname,int sockfd,ph iph);
int callback(void *prma,int f_num,char * f_value[],char * f_name[]);
int select_udata(sqlite3 *db,char *tbname,int sockfd,user s);
int callbacku(void *prma,int f_num,char * f_value[],char * f_name[]);
int select_udatalog(sqlite3 *db,char *tbname,int sockfd,user s);
int callbackulog(void *prma,int f_num,char * f_value[],char *f_name[]);
int select_alldata(sqlite3 *db,char *tbname,int sockfd,ph iph);
int callbackall(void *prma,int f_num,char * f_value[],char * f_name[]);
int select_udataall(sqlite3 *db,char *tbname,int sockfd,user s);
int callbackuall(void *prma,int f_num,char * f_value[],char *f_name[]);
int delete_data(sqlite3 *db,char *tbname,ph iph);
int delete_udata(sqlite3 *db,char *tbname,user s);
int update_data(sqlite3 *db,char *tbname,ph iph);
int update_udata(sqlite3 *db,char *tbname,user s);
int update_udatarem(sqlite3 *db,char *tbname,user s);
int update_udataline(sqlite3 *db,char *tbname,user s);
int update_udatauline(sqlite3 *db,char *tbname,user s);
int update_alldatauline(sqlite3 *db,char *tbname);
#endif

主函数

#include "../include/server.h"int main(int argc,const char *argv[])
{if(argc != 3){printf("CMDLINE NOT EQUAL THREE!\n");return -1;}sqlite3 *db;db = sql_open("test.db");creat_utable(db,"admin");creat_utable(db,"user"); //用户信息creat_table(db,"phone"); //商家仓库update_alldatauline(db,"user");update_alldatauline(db,"admin");int sockfd = creatlink(argv);struct sockaddr_in cliaddr;int len = sizeof(cliaddr);fd_set rest,allset;FD_ZERO(&rest);FD_ZERO(&allset);FD_SET(sockfd,&allset);int maxfd = sockfd;while(1){rest = allset;if(select(maxfd+1,&rest,NULL,NULL,NULL) < 0){printf("select error\n");exit(-1);}if(FD_ISSET(sockfd,&rest)){int confd = accept(sockfd,(struct sockaddr *)&cliaddr,&len);if(confd < 0){perror("accept error");exit(-1);}printf("accept ok\n");FD_SET(confd,&allset);if(confd > maxfd)maxfd = confd;pid_t pid;pid = fork();if(pid == 0){printf("child pid = %d\n",getpid());while(1){int ret = srecv(confd,db);if(ret == 0){printf("closed client\n");exit(-1);}} }}}
}

创建TCP连接的子函数(监听)

#include "../include/server.h"int creatlink(const char *argv[])
{int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd < 0){perror("socket error");return -1;}printf("sock ok\n");struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(atoi(argv[2]));seraddr.sin_addr.s_addr = inet_addr(argv[1]);int len = sizeof(seraddr);int ret = bind(sockfd,(struct sockaddr *)&seraddr,len);if(ret < 0){perror("bind error");exit(-1);}printf("bind ok\n");ret = listen(sockfd,5);if(ret < 0){perror("listen error");exit(-1);}printf("listen...\n");return sockfd;
}

服务器端发送子函数(send)

#include "../include/server.h"int ssendcmd(int sockfd,char *buf)
{if(send(sockfd,buf,sizeof(buf),0) < 0){perror("send error");exit(-1);}
}int ssend(int sockfd,user s)
{if(send(sockfd,&s,sizeof(user),0) < 0){perror("send error");exit(-1);}
}int ssendp(int sockfd,ph iph)
{if(send(sockfd,&iph,sizeof(ph),0) < 0){perror("send error");exit(-1);}
}

服务器端接收子函数(recv)

#include "../include/server.h"int srecv(int sockfd,sqlite3 *db)
{user s;ph iph;memset(&s,'\0',sizeof(user));memset(&iph,'\0',sizeof(ph));char buf[20] = {0};int ret = recv(sockfd,&buf,sizeof(buf),0);// cmd recvif(ret < 0){perror("recv error");exit(-1);}if(0 == strcmp(buf,"readylogin\0")) //login{printf("recv login cmd res\n");ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}select_udatalog(db,"user",sockfd,s);ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}if(0 == strcmp(s.linecmd,"online\0")){update_udataline(db,"user",s);}}if(0 == strcmp(buf,"readyadminlogin\0")) //adminlogin{printf("recv adminlogin cmd res\n");ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}select_udatalog(db,"admin",sockfd,s);ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}if(0 == strcmp(s.linecmd,"online\0")){update_udataline(db,"admin",s);}}if(0 == strcmp(buf,"readyregister\0")) //register{printf("recv register cmd res\n");ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}select_udata(db,"user",sockfd,s);ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}if(0 != strcmp(s.cmd,"userexit\0")){s.rem = 10000;insert_udata(db,"user",s);creat_table(db,s.ID);}}if(0 == strcmp(buf,"readyaddp\0")) //add phone{printf("recv addp cmd res\n");ret = recv(sockfd,&iph,sizeof(ph),0);if(ret < 0){perror("recv error");exit(-1);}insert_data(db,"phone",iph);}if(0 == strcmp(buf,"readyupdate\0")) //update{printf("recv update cmd res\n");ret = recv(sockfd,&iph,sizeof(ph),0);if(ret < 0){perror("recv error");exit(-1);}select_data(db,"phone",sockfd,iph);ret = recv(sockfd,&iph,sizeof(ph),0);if(ret < 0){perror("recv error");exit(-1);}if(0 == strcmp(iph.pn,"nophone")){return 1;}update_data(db,"phone",iph);}if(0 == strcmp(buf,"readydeletep\0\n")){printf("recv deletep cmd res\n");ret = recv(sockfd,&iph,sizeof(ph),0);if(ret < 0){perror("recv error");exit(-1);}delete_data(db,"phone",iph);}if(0 == strcmp(buf,"readyadminfind\0")){printf("recv adminfind cmd res\n");select_udataall(db,"user",sockfd,s);}if(0 == strcmp(buf,"readyadminfindp\0")){printf("recv adminfindp cmd res\n");select_alldata(db,"phone",sockfd,iph);}if(0 == strcmp(buf,"readycontral\0")){printf("recv readycontral cmd res\n");ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}select_udata(db,"user",sockfd,s);}if(0 == strcmp(buf,"readyadmincon\0")){printf("recv admin contral cmd res\n");ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}if(0 == strcmp(s.cmd,"admindelete\0")){delete_udata(db,"user",s);char sql[200] = {0};sprintf(sql,"drop table %s",s.ID);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("drop error:%s\n",errmsg);return -1;}}if(0 == strcmp(s.cmd,"adminban\0")){char sql[200] = {0};sprintf(sql,"update user set cmd = '%s' where ID = '%s'",s.cmd,s.ID);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("update error:%s\n",errmsg);return -1;}printf("adminban ok\n");}if(0 == strcmp(s.cmd,"adminisban\0")){select_udata(db,"user",sockfd,s);ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}if(0 == strcmp(s.cmd,"adminban\0")){char sql[200] = {0};sprintf(sql,"update user set cmd = '%s' where ID = '%s'",s.cmd,s.ID);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("update error:%s\n",errmsg);return -1;}strcpy(s.cmd,"isbaned\0");ssend(sockfd,s);printf("adminisban ok\n");}else{strcpy(s.cmd,"noban\0");ssend(sockfd,s);printf("adminnotban ok\n");}}}if(0 == strcmp(buf,"readycustomfind\0")){printf("recv customfind cmd res\n");select_alldata(db,"phone",sockfd,iph);}if(0 == strcmp(buf,"readyrqnum\0")){printf("recv rqnum cmd res\n");ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}select_udata(db,"user",sockfd,s);}if(0 == strcmp(buf,"readycustombuy\0")){printf("recv custombuy cmd res\n");ret = recv(sockfd,&iph,sizeof(iph),0);if(ret < 0){perror("recv error");exit(-1);}select_data(db,"phone",sockfd,iph);ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}if(0 != strcmp(s.cmd,"nophone\0")){select_udata(db,"user",sockfd,s);}}if(0 == strcmp(buf,"readybuy\0")){printf("recv readybuy cmd res\n");ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}if(0 != strcmp(s.cmd,"lackofbalance\0")){update_udatarem(db,"user",s);ret = recv(sockfd,&iph,sizeof(ph),0);if(ret < 0){perror("recv error");exit(-1);}insert_data(db,s.ID,iph);}}if(0 == strcmp(buf,"readywarehouse\0")){printf("recv warehouse cmd res\n");ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}select_alldata(db,s.ID,sockfd,iph);}if(0 == strcmp(buf,"readyaddmon\0")){printf("recv addmon cmd res\n");ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}if(0 != strcmp(s.cmd,"cdknottrue\0")){select_udata(db,"user",sockfd,s);       ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}update_udatarem(db,"user",s);select_udata(db,"user",sockfd,s);}}if(0 == strcmp(buf,"readychangepswd\0")){printf("recv changepswd cmd res\n");ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}select_udata(db,"user",sockfd,s);ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}if(0 != strcmp(s.ID,"nouser\0")){update_udata(db,"user",s);}}if(0 == strcmp(buf,"readylogout\0")){printf("recv logout cmd res\n");ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}update_udatauline(db,"user",s);}if(0 == strcmp(buf,"readyadminlogout\0")){printf("recv logout cmd res\n");ret = recv(sockfd,&s,sizeof(user),0);if(ret < 0){perror("recv error");exit(-1);}update_udatauline(db,"admin",s);}return 1;
}

sqlite3子函数

#include "../include/server.h"sqlite3 *sql_open(char *dbname)
{sqlite3 *db = NULL;int sq = 0;sq = sqlite3_open(dbname,&db);if(sq != SQLITE_OK){perror("db open error");return NULL;}printf("db open ok!\n");return db;
}int creat_table(sqlite3 *db,char *tbname)
{char sql[200] = {0};sprintf(sql,"create table if not exists %s (phone TEXT,system TEXT,cpu TEXT,ram INTEGER,price REAL)",tbname);char *errmsg = NULL;int sq = 0;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("create error:%s\n",errmsg);return -1;}printf("create ok\n");return 0;
}int creat_utable(sqlite3 *db,char *tbname)
{char sql[200] = {0};sprintf(sql,"create table if not exists %s (ID TEXT,password TEXT,rem REAL,historym REAL,viplevel INTEGER,cmd TEXT,linecmd TEXT)",tbname);char *errmsg = NULL;int sq = 0;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("create error:%s\n",errmsg);return -1;}printf("create ok\n");return 0;
}int insert_data(sqlite3 *db,char *tbname,ph iph)
{char sql[200] = {0};sprintf(sql,"insert into %s values('%s','%s','%s','%d','%f')",tbname,iph.pn,iph.sys_type,iph.cpu_type,iph.RAM_num,iph.price);char *errmsg = NULL;int sq = 0;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("insert error:%s\n",errmsg);return -1;}printf("insert ok\n");return 0;
}int insert_udata(sqlite3 *db,char *tbname,user s)
{char sql[200] = {0};sprintf(sql,"insert into %s values('%s','%s','%f','%f','%d','%s','%s')",tbname,s.ID,s.password,s.rem,s.historym,s.viplevel,s.cmd,s.linecmd);char *errmsg = NULL;int sq = 0;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("insert error:%s\n",errmsg);return -1;}printf("insert ok\n");return 0;
}int select_data(sqlite3 *db,char *tbname,int sockfd,ph iph)
{char sql[200] = {0};sprintf(sql,"select * from %s where phone = '%s' ",tbname,iph.pn);printf("%s\n",sql);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,callback,&sockfd,&errmsg);if(sq != SQLITE_OK){printf("select error:%s\n",errmsg);return -1;}printf("select ok\n");ph iph1;strcpy(iph1.pn,"nophone\0");ssendp(sockfd,iph1);return 0;
}int callback(void *prma,int f_num,char *f_value[],char *f_name[])
{int *pfd = (int *)prma;int sockfd = *pfd;ph iph;memset(&iph,'\0',sizeof(ph));strcpy(iph.pn,f_value[0]);strcpy(iph.sys_type,f_value[1]);strcpy(iph.cpu_type,f_value[2]);iph.RAM_num = atoi(f_value[3]);iph.price = atoi(f_value[4]);printf("%s %s %s %d %f\n",iph.pn,iph.sys_type,iph.cpu_type,iph.RAM_num,iph.price);ssendp(sockfd,iph);return SQLITE_OK;
}int select_udata(sqlite3 *db,char *tbname,int sockfd,user s)
{char sql[200] = {0};sprintf(sql,"select * from %s where id = '%s'",tbname,s.ID);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,callbacku,&sockfd,&errmsg);if(sq != SQLITE_OK){printf("select error:%s\n",errmsg);return -1;}printf("select ok\n");user s1;strcpy(s1.ID,"nouser\0");ssend(sockfd,s1);return 0;
}int callbacku(void *prma,int f_num,char * f_value[],char *f_name[])
{int *pfd = (int *)prma;int sockfd = *pfd;user s;memset(&s,'\0',sizeof(user));strcpy(s.ID,f_value[0]);s.rem = atoi(f_value[2]);s.historym = atoi(f_value[3]);s.viplevel = atoi(f_value[4]);strcpy(s.cmd,f_value[5]);strcpy(s.linecmd,f_value[6]);printf("%s %s %.1f %.1f %d %s %s\n",s.ID,s.password,s.rem,s.historym,s.viplevel,s.cmd,s.linecmd);ssend(sockfd,s);return SQLITE_OK;
}int select_udatalog(sqlite3 *db,char *tbname,int sockfd,user s)
{char sql[200] = {0};sprintf(sql,"select * from %s where id = '%s' and password = '%s'",tbname,s.ID,s.password);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,callbackulog,&sockfd,&errmsg);if(sq != SQLITE_OK){printf("select error:%s\n",errmsg);return -1;}printf("select ok\n");user s1;strcpy(s1.ID,"nouser\0");ssend(sockfd,s1);return 0;
}int callbackulog(void *prma,int f_num,char * f_value[],char *f_name[])
{int *pfd = (int *)prma;int sockfd = *pfd;user s;memset(&s,'\0',sizeof(user));strcpy(s.ID,f_value[0]);strcpy(s.password,f_value[1]);s.rem = atoi(f_value[2]);s.historym = atoi(f_value[3]);s.viplevel = atoi(f_value[4]);strcpy(s.cmd,f_value[5]);strcpy(s.linecmd,f_value[6]);printf("%s %s %.1f %.1f %d %s %s\n",s.ID,s.password,s.rem,s.historym,s.viplevel,s.cmd,s.linecmd);ssend(sockfd,s);return SQLITE_OK;
}int select_alldata(sqlite3 *db,char *tbname,int sockfd,ph iph)
{char sql[200] = {0};sprintf(sql,"select * from %s ",tbname);printf("%s\n",sql);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,callbackall,&sockfd,&errmsg);if(sq != SQLITE_OK){printf("select error:%s\n",errmsg);return -1;}printf("select ok\n");ph iph1;strcpy(iph1.pn,"nophone\0");ssendp(sockfd,iph1);return 0;
}int callbackall(void *prma,int f_num,char *f_value[],char *f_name[])
{int *pfd = (int *)prma;int sockfd = *pfd;ph iph;memset(&iph,'\0',sizeof(ph));strcpy(iph.pn,f_value[0]);strcpy(iph.sys_type,f_value[1]);strcpy(iph.cpu_type,f_value[2]);iph.RAM_num = atoi(f_value[3]);iph.price = atoi(f_value[4]);printf("%s %s %s %d %f\n",iph.pn,iph.sys_type,iph.cpu_type,iph.RAM_num,iph.price);ssendp(sockfd,iph);return SQLITE_OK;
}int select_udataall(sqlite3 *db,char *tbname,int sockfd,user s)
{char sql[200] = {0};sprintf(sql,"select * from %s ",tbname);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,callbackuall,&sockfd,&errmsg);if(sq != SQLITE_OK){printf("select error:%s\n",errmsg);return -1;}printf("select ok\n");user s1;strcpy(s1.ID,"nouser\0");ssend(sockfd,s1);return 0;
}int callbackuall(void *prma,int f_num,char * f_value[],char *f_name[])
{int *pfd = (int *)prma;int sockfd = *pfd;user s;memset(&s,'\0',sizeof(user));strcpy(s.ID,f_value[0]);strcpy(s.password,f_value[1]);s.rem = atoi(f_value[2]);s.historym = atoi(f_value[3]);s.viplevel = atoi(f_value[4]);strcpy(s.cmd,f_value[5]);strcpy(s.linecmd,f_value[6]);printf("%s %s %.1f %.1f %d %s %s\n",s.ID,s.password,s.rem,s.historym,s.viplevel,s.cmd,s.linecmd);ssend(sockfd,s);return SQLITE_OK;
}int delete_data(sqlite3 *db,char *tbname,ph iph)
{char sql[200] = {0};sprintf(sql,"delete from %s where phone = '%s'",tbname,iph.pn);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("delete error:%s\n",errmsg);return -1;}printf("delete ok\n");return 0;
}int delete_udata(sqlite3 *db,char *tbname,user s)
{char sql[200] = {0};sprintf(sql,"delete from %s where ID = '%s'",tbname,s.ID);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("delete error:%s\n",errmsg);return -1;}printf("delete ok\n");return 0;
}int update_data(sqlite3 *db,char *tbname,ph iph)
{char sql[200] = {0};sprintf(sql,"update %s set price = '%f' where phone = '%s' ",tbname,iph.price,iph.pn);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("update error:%s\n",errmsg);return -1;}printf("update ok\n");return 0;
}int update_udata(sqlite3 *db,char *tbname,user s)
{char sql[200] = {0};sprintf(sql,"update %s set password = '%s' where ID = '%s' ",tbname,s.password,s.ID);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("update error:%s\n",errmsg);return -1;}printf("update ok\n");return 0;
}int update_udatarem(sqlite3 *db,char *tbname,user s)
{char sql[200] = {0};sprintf(sql,"update %s set rem = '%f' ,historym = '%f',viplevel = '%d' where ID = '%s' ",tbname,s.rem,s.historym,s.viplevel,s.ID);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("update error:%s\n",errmsg);return -1;}printf("update ok\n");return 0;
}int update_udataline(sqlite3 *db,char *tbname,user s)
{char sql[200] = {0};sprintf(sql,"update %s set linecmd = 'online' where ID = '%s' ",tbname,s.ID);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("update error:%s\n",errmsg);return -1;}printf("update ok\n");return 0;
}int update_udatauline(sqlite3 *db,char *tbname,user s)
{char sql[200] = {0};sprintf(sql,"update %s set linecmd = 'notonline' where ID = '%s' ",tbname,s.ID);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("update error:%s\n",errmsg);return -1;}printf("update ok\n");return 0;
}int update_alldatauline(sqlite3 *db,char *tbname)
{char sql[200] = {0};sprintf(sql,"update %s set linecmd = 'notonline'",tbname);int sq = 0;char *errmsg = NULL;sq = sqlite3_exec(db,sql,NULL,NULL,&errmsg);if(sq != SQLITE_OK){printf("update error:%s\n",errmsg);return -1;}printf("update ok\n");return 0;
}

基于Linux的socket网络编程项目——游侠手机商城相关推荐

  1. 【Linux】socket网络编程之服务器与客户端的数据交互

    [Linux]socket网络编程之服务器与客户端的数据交互 前言参考 argc !=2是什么意思 inet pton函数 对stdin,stdout 和STDOUT_FILENO,STDIN_FIL ...

  2. socket网络编程 java_Java Web 基础(一) 基于TCP的Socket网络编程

    一.Socket简单介绍 Socket通信作为Java网络通讯的基础内容,集中了异常.I/O流模式等众多知识点.学习Socket通信,既能够了解真正的网络通讯原理,也能够增强对I/O流模式的理解. 1 ...

  3. Linux下Socket网络编程

    什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程, ...

  4. Windows/Linux TCP Socket网络编程简介及测试代码

    典型的网络应用是由一对程序(即客户程序和服务器程序)组成的,它们位于两个不同的端系统中.当运行这两个程序时,创建了一个客户进程和一个服务器进程,同时它们通过从套接字(socket)读出和写入数据在彼此 ...

  5. 网络编程与分层协议设计:基于linux平台实现,网络编程与分层协议设计:基于Linux平台实现...

    图书简介 本书以Linux网络套接字编程和网络分层协议的设计与程序实现为主题,详细介绍如何在Linux平台下进行套接字程序设计,并给出了一个基于分层协议的应用实例,用于模拟Linux网络协议栈中IP层 ...

  6. 基于Udp的Socket网络编程

    1.新建一个工作空间 Udp 添加两个工程UdpClient 和 UdpSrv 2.在工程UdpSrv中添加UdpSrv.cpp文件 代码如下: #include <Winsock2.h> ...

  7. Linux下Socket网络编程之点对点聊天室

    1. 系统设计的目的与意义 掌握信号与信号处理的概念,了解点对点聊天室的设计需求,掌握相关的理论知识,切实掌握程序设计的分析方法,勇于实践,多参考开源项目和代码.实现点对点聊天室程序设计,Linux网 ...

  8. 基于TCP的Socket网络编程,有图有代码

    1.新建一个工作区 Tcp 在工作区中添加两个工程 TcpSrv(服务端)和TcpClient (客户端) 2.在工程TcpSrv添加TcpSrv.cpp文件 代码如下: #include <W ...

  9. Linux下Socket网络编程send和recv使用注意事项

    1.send函数 ssize_t send( SOCKET s, const char *buf, size_t len, int flags ); (1)send先比较待发送数据的长度len和套接字 ...

最新文章

  1. [原]动态创建Web控件制做计算器
  2. MySQL数据库分表分区
  3. mysql 简单优化规则
  4. Java基础:类加载器
  5. aliyun tianchi ai contest meeting note
  6. 0 win10重装partition_修复Win10系统无法安装系统保留分区方法
  7. H5禁止弹窗页面滚动
  8. tomcat7 https 拒绝连接_物与网怎么连接呢?物联网架构及五大通信协议
  9. 使用lamba中stream 进行分组统计
  10. Cantor表(洛谷P1014题题解,Java语言描述)
  11. mysql账号相关的操作和安全管理
  12. 【pyhon】nvshens图片批量下载爬虫1.01
  13. [位运算|状态压缩] leetcode 78 子集
  14. arduino UNO 点亮LED例程
  15. Java邮件发送:带附件 or 不带附件 is nothing
  16. origin 修改默认字体
  17. el-menu菜单下划线解决办法
  18. Windows 下的 Vim 编程
  19. 一年来终于用实际案例把matplotlib的绘图坐标轴说清楚了-太给力了
  20. Django框架之视图函数views

热门文章

  1. 王牌特工:黄金圈 经典例句
  2. 物理层-计算机网络知识汇总(二)|Zam9036博客
  3. 避免当野monkey, 走野路子
  4. 「Tracup」一款拒绝加班的项目管理工具
  5. 苹果删除照片不释放内存_别再胡乱清理垃圾了,只要删除这6个文件夹,瞬间释放20GB内存...
  6. VictoriaMetrics与Thanos方案对比
  7. Apple DNS加速
  8. 今天是我的生日,十年如一日
  9. 冷库用电量计算机方式,冷库耗电量计算方法(附计算公式)
  10. 计算机显示屏知识,计算机配置知识之显示屏