TPC服务器与客户端的搭建
服务器
enum Type{
TYPE_REGIST,
TYPE_LOGIN
};
typedef struct Pack{
int size;
enum Type type;
char buf[2024];
int num;
}pack_t;
typedef struct N0{//节点
union{
char N1[100];
int len;
};
struct N0 *next;
}N0,*N0_Ptr;
N0_Ptr create(){//头结点
N0_Ptr P = (N0_Ptr)malloc(sizeof(N0));
if(P == NULL){printf("创建失败\n");return NULL;}
P->len = 0;
P->next = NULL;
return P;
}
N0_Ptr create_2(char* B_buf){//创建节点
N0_Ptr P = (N0_Ptr)malloc(sizeof(N0));
if(P == NULL){printf("创建失败\n");return NULL;}
strcpy(P->N1,B_buf);
P->next = NULL;
return P;
}
void tail_add(N0_Ptr P,char* B_buf){//尾插
if(NULL == P)
{
printf("插入失败!\n");
return;
}
N0_Ptr p = create_2(B_buf);
N0_Ptr q = P;
while(q->next != NULL)
{
q=q->next;
}
q->next = p;
P->len++;
}
void read_B(pack_t* pack,N0_Ptr P){
char* buf = pack->buf;
int num1 = 0;//已经读取多少数据
while(1){
short num2 = *(short*)(buf+num1);//buf中未读取的2字节
if(0 == num2){
printf("A\n");
break;
}
num1 += 2;
char B_buf[num2 +1];
memset(B_buf,0,num2+1);
memcpy(B_buf,buf+num1,num2);
num1 += num2;
// printf("%s\n",B_buf);
tail_add(P,B_buf);
}
}
int main(int argc, const char *argv[])
{
//创建链表
N0_Ptr P2 = create();//头结点
if(argc != 2){
printf(" 请输入端口号:");
return -1;
}
int port =atoi(argv[1]);
//服务器 A
int A = 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");
bind(A,(struct sockaddr *)&addr,sizeof(addr));
listen(A,10);
//客户端 B
addr_in_t B_addr = {0};
int B_len = sizeof(B_addr);
int B = accept(A,(struct sockaddr*)&B_addr,&B_len);
if(B != -1){
printf("有客户端连接\n");
}
//读取客户端信息
N0_Ptr p = P2;
int O = 1;
while(1){
int size = 0;
read(B,&size,4);
pack_t P = {0};
read(B,(char*)&P+4,size - 4);
P.size = size;
read_B(&P,P2);
while(p->next != NULL){
p = p->next;
if(0 != O%2){
printf("账号:%s\n",p->N1);
}else{
printf("密码:%s\n",p->N1);
}
O++;
}
}
return 0;
}
客户端
enum Type{
TYPE_REGIST,
TYPE_LOGIN
};
typedef struct Pack{
int size;
enum Type type;
char buf[2048];
int num;
}pack_t;
void append(pack_t* pack,const char* date){
char* buf = pack->buf;
int len = strlen(date);
*(short*)(buf+pack->num) = len;
pack->num += 2;
memcpy(buf+pack->num,date,len);
pack->num += len;
pack->size = pack->num + 8;
}
int main(int argc, const char *argv[])
{
if(argc != 2){
printf(" 请输入端口号:");
return -1;
}
int port =atoi(argv[1]);
//客户端 B
int B = 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.127.78");
connect(B,(struct sockaddr *)&addr,sizeof(addr));
while(1){
pack_t P = {0};
P.type = TYPE_LOGIN;
char name[20] = "";
char pswd[20] = "";
printf("请输入账号:");
scanf("%s",name);
while(getchar()!=10);
printf("请输入密码:");
scanf("%s",pswd);
while(getchar()!=10);
append(&P,name);
append(&P,pswd);
write(B,&P,P.size);
}
return 0;
}
现象: