c代码写聊天室喔的思路 我遇到的段错误

xiaoxiao2021-02-28  24

登陆和注册 下次发

定义一个结构体 用来存放id password用来接收客户机的登陆信息//typdef  user{int id;char password[1024];}User;

建立一个循环链表 用来存放已经上线的客户机套接字描述符sockfd 以及他的账号ID 账号ID分别用来群发和私聊//typedef struct list{int sockfd;int id;

struct list *next;}List;

再定义一个结构体 用来存放已经上线得客户机得套接字描述符sockfd  以及登陆结果flag 和 链表的头指针typedef struct node{int sockfd;int flag;struct list* head}*Node;

在main函数里 我们首先定义一个结构体struct node p;这个结构体很重要 他是用来向线程里传递数据的,它同样也是用来存放信息的,main函数里面只是给p.sockfd和p.head赋值,并没有给登陆结果登记,这里有个问题你服务器开辟一个线程去处理一个客户机的请求,你用的是这个结构体的地址,如果在这个客户机没有结束前,别的客户机也开始登陆了,它用的也是这个结构体,这个结构体的flag值会被覆盖,可能会导致第一个客户机登陆出现错误,这个问题我可以告诉你 是可能会发生的,比如两个客户机同时登陆,这个标志位是同步的,结果是随机的 就看谁后执行,因为结构体定义的时候在内存中开辟了这个结构体内容大小的空间,你在对其中变量赋值,必然会覆盖,告诉服务器哪个客户机请求连接,从而用read函数读取该客户机发送过来的信息,在从已注册过的数据库中匹配,当然每次从数据库查找,这个其实开销很大,可以考虑把注册的用户放到链表里!

讲一下我遇到的段错误吧,大部分段错误都是内存这方面有问题,比如你指明一个机构体指针,你还没有对其在内存中申请空间,你就用p->..这样的命令,我可以告诉你,这肯定是个段错误,我的这个段错误其实和这个也有关系,我开始定义了一个结构体指针Node,然后我给他申请堆空间,然后用p->这样的格式给它其中的头结点赋值,赋值的是链表的头指针,我在监听循环里面最后一句用了memset(&p,0,sizeof(struct node)),分析一下 这句话肯定是不对的,我们是要对这个结构体清空,你传的是个它首地址的地址,这都不知道跑哪去了!,而且这句话很多余,你没必要写这句话,这句话你加上去你会导致你的线程无法执行,因为你线程还在用你的这个结构体你给清空了,线程自然而然就崩了!

转载请注明原文地址: https://www.6miu.com/read-2349977.html

最新回复(0)