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

登陆和注册 下次发

定义一个结构体 用来存放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)),分析一下 这句话肯定是不对的,我们是要对这个结构体清空,你传的是个它首地址的地址,这都不知道跑哪去了!,而且这句话很多余,你没必要写这句话,这句话你加上去你会导致你的线程无法执行,因为你线程还在用你的这个结构体你给清空了,线程自然而然就崩了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值