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. 因为应用层关了但其实内核中的缓存里面还是存有数据的。导致下一次发数据的时候就乱读取了。