我遇到的socket tcp/ip问题

1.坑爹,居然由于客户端太快,导致 客户1的链接刚刚到代码1处,客户2的链接就立马到了代码1处,吧客户1的connfd给覆盖掉了。到处出现2个同样的线程。尼玛

int connfd = accept(server_socket, (struct sockaddr *)&client_addr,&length);//1
if(pthread_create(&tid, NULL, RequestHandle, (void *)&connfd) != 0)         //2
{
cout<<"thread exception!"<<endl;
exit(1);
}

因为覆盖了,所以导致两条客户端的消息,都发送到同一条服务端的链接了,导致应用层自定协议读取数据紊乱,然后就free() : invali next size xxxx .... 段错误,直接内存错误。


解决:唉,网上没找到,还得自己想办法。我去。我的想法是,用list来push_back()每个新的“套接字“,这样就不会存在重复了,对吧。尼玛。估计有更好的解决方法,等我找到了再写上。尼玛。

好吧,我承认上面的方法没用,现在又想出一个,枷锁咯。让这里和线程里面的那个接受东东作为一个原子操作即可。这样就不会有覆盖鸟。


2.不断的创建线程,但你必须自己释放线程缩开辟的堆栈。虽然这些堆栈是系统帮你开的,但是是你要求系统给你弄个线程的。所以呢,他开辟,你释放。

让线程自己设一个标志,让自己脱离其他,然后线程就能够自己完毕后自己释放了。否则线程结束了,他的堆栈没人释放的。坑爹。 就是那个 pxxxxxxxx(self)啥的。


3.为什么rb+ 和 wb+区别,写速度性能这么大。

4.永不关闭的链接,如果客户端应用层关了又开,开了又关,会导致服务端应用层协议获取乱数据。导致over. 因为应用层关了但其实内核中的缓存里面还是存有数据的。导致下一次发数据的时候就乱读取了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值