一.客户端代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h> /* 套接字用的头文件*/
#include <sys/socket.h>
#include <strings.h>
#include <netinet/in.h>//inet_addr ip地址格式的转换
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#define R 1//user - register
#define L 2//user - login
#define Q 3//user - query
#define H 4//user - history
//定义通信双方的信息结构体
#define N 32
typedef struct
{
int type;
char name[N];
char data[256];
}MSG;
/***************************************
**argc 表示参数个数 argv表示具体参数****
****************************************/
int do_register(int sockfd,MSG *msg) //需要文件描述符,传输结构体
{
msg->type = R;
printf("input name:");
scanf("%s",msg->name);
getchar();
printf("input password:");
scanf("%s",msg->data);
if(send(sockfd,msg,sizeof(MSG),0)<0)
{
printf("fail to send.\n");
return -1;
}
if(recv(sockfd,msg,sizeof(MSG),0)<0)
{
printf("fail to recv...\n");
return -1;
}
//ok! or usr alread exist
printf("%s\n",msg->data);
return 0;
}
int do_login(int sockfd,MSG *msg)
{
msg->type = L;
printf("input name:");
scanf("%s",msg->name);
getchar();
printf("input password:");
scanf("%s",msg->data);
if(send(sockfd,msg,sizeof(MSG),0)<0)//发送给服务器
{
printf("fail to send.\n");
return -1;
}
if(recv(sockfd,msg,sizeof(MSG),0)<0)//从服务器接受
{
printf("fail to recv...\n");
return -1;
}
if(strncmp(msg->data,"OK",3) == 0)
{
printf("login ok\n");
return 1;
}
else
{
printf("%s",msg->data);
}
return 0;//登录成功
}
int do_query(int sockfd,MSG *msg)
{
msg->type = Q;
puts("-------------------");
while(1)
{
printf("Input word:");
scanf("%s",msg->data);
getchar();
//客户端输入# 返回上级菜单。
if(strncmp(msg->data,"#",1)==0)
break;
//将要查询的单词发送给服务器
if(send(sockfd,msg,sizeof(MSG),0)<0)
{
printf("fail to send.\n");
return -1;
}
//等待接受服务器,传递回来的单词的注释信息
if(recv(sockfd,msg,sizeof(MSG),0)<0)
{
printf("fail wo recv.\n");
return -1;
}
printf("%s\n",msg->data);
}
return 0;
}
int do_history(int sockfd,MSG *msg)
{
msg->type = H;
send(sockfd,msg,sizeof(MSG),0);
//接受服务器 传递回来的历史信息
while(1)
{
recv(sockfd,msg,sizeof(MSG),0);
if(msg->