思维导图
服务器
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
enum Type
{
TYPE_REGIST,
TYPE_LOGIN,
// TYPE_CHAT
};
typedef struct User
{
char name[20];
char pswd[20];
// int sock;
}user_t;
typedef struct Pack
{
enum Type type;
char name[20];
char pswd[20];
char tarname[20];
char text[1024];
}pack_t;
void read_data(int client);
int insert_user(user_t user);
int find_user(const char *username);
int callback(void * arg,int argc,char** argv,char** col);
//user_t user_arr[50]={0};
//int user_len=0;
user_t user={0,0};
int main(int argc, const char *argv[])
{
if(argc !=2)
{
printf("请输入端口号:\n");
return 1;
}
int port=atoi(argv[1]);
int 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=inet_addr("0.0.0.0");
if(bind(server,(addr_t*)&addr,sizeof(addr))==-1)
{
perror("bind");
return 1;
}
listen(server,10);
int epfd=epoll_create1(EPOLL_CLOEXEC);
struct epoll_event epoll_stdin={.events=EPOLLIN,.data.fd=0};
struct epoll_event epoll_server={.events=EPOLLIN,.data.fd=server};
epoll_ctl(epfd,EPOLL_CTL_ADD,0,&epoll_stdin);
epoll_ctl(epfd,EPOLL_CTL_ADD,server,&epoll_server);
struct epoll_event arr[50]={0};
while(1)
{
int len=epoll_wait(epfd,arr,50,-1);
for(int i=0;iname,argv[0]);
strcpy(brr->pswd,argv[1]);
return 1;
}
void read_data(int client)
{
pack_t pack={0};
int res=read(client,&pack,sizeof(pack));
switch(pack.type)
{
case TYPE_REGIST:
{
int res=find_user(pack.name);
char *msg=NULL;
if(res==-1)
{
user_t user ={0};
strcpy(user.name,pack.name);
strcpy(user.pswd,pack.pswd);
insert_user(user);
msg="注册成功";
}
else
{
msg="该账号已存在";
}
strcpy(pack.text,msg);
write(client,&pack,sizeof(pack));
break;
}
case TYPE_LOGIN:
{
int res=find_user(pack.name);
char *msg=NULL;
if(res=-1)
{
msg="该账号不存在";
}
else
{
// user_t user=user_arr[res];
if(strcmp(user.pswd,pack.pswd)==0)
{
msg="登录成功";
// user_arr[res].sock=client;
}
else
{
msg="密码错误";
}
}
strcpy(pack.text,msg);
write(client,&pack,sizeof(pack));
break;
}
}
}
客户端
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_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 *thread_main(void *arg)
{
int client=*(int*)arg;
while(1)
{
pack_t pack={0};
int res=read(client,&pack,sizeof(pack));
if(res==0)
{
break;
}
switch(pack.type)
{
case TYPE_REGIST:
{
printf("%s\n",pack.text);
break;
}
case TYPE_LOGIN:
{
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]);
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.133.128");
if(connect(client,(addr_t*)&addr,sizeof(addr))==-1)
{
perror("connect");
return 1;
}
pthread_t id;
pthread_create(&id,0,thread_main,&client);
pthread_detach(id);
while(1)
{
int ch=-1;
printf("1.注册\n");
printf("2.登录\n");
printf("0.退出\n");
printf("请选择:");
scanf("%d",&ch);
while(getchar()!=10);
switch(ch)
{
case 1:
{
pack_t pack={0};
printf("请输入账号:");
scanf("%s",pack.name);
while(getchar()!=10);
printf("请输入密码:");
scanf("%s",pack.pswd);
while(getchar()!=10);
pack.type=TYPE_REGIST;
write(client,&pack,sizeof(pack));
break;
}
case 2:
{
pack_t pack={0};
printf("请输入账号:");
scanf("%s",pack.name);
while(getchar()!=10);
printf("请输入密码:");
scanf("%s",pack.pswd);
while(getchar()!=10);
pack.type=TYPE_LOGIN;
write(client,&pack,sizeof(pack));
break;
}
case 0:
{
break;
}
}
}
return 0;
}