linux下一对多socket服务器端多线程泄露问题
线程创建多了,没有释放。导致内存泄露。。。
int main()
{
int len;
int on=1;
// pMachList = CreateEmptyLinklist(); DataBaseInit(); ReadAdjust();
int *temp;
socketSrv=socket(AF_INET,SOCK_STREAM,0); addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(8000);
addrSrv.sin_addr.s_addr=htonl(INADDR_ANY);
memset(addrSrv.sin_zero,0,8); if((setsockopt(socketSrv,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))<0)
{
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
if(bind(socketSrv,(struct sockaddr*)&addrSrv,sizeof(addrSrv))<0)
perror("bind");
listen(socketSrv,100);
len=sizeof(addrClt);
while(1)
{
pthread_t pid;
temp=(int *)malloc(sizeof(int));
*temp= accept(socketSrv,(struct sockaddr*)&addrClt,(socklen_t*)(&len));
printf("accept socket= %d\n",*temp); if(-1==*temp){
printf("accept error \n");
continue;
}
int err;
err=pthread_create(&pid,NULL,(void *)f1,temp);//一个线程处理一个客户端
if (err != 0)
printf("can't create thread: %s\n", strerror(err));
}
close(socketSrv);
return 0;
}
在线程中加入: pthread_detach(pthread_self());
线程结束的时候自动销毁。。。
void f1(int *socketCtl2)//利用pthread_create把参数传进来
{
unsigned char buf[1024];
int len,i;
memset(buf,0,1024);
struct FileRecord temFile;
unsigned short CalCRC;
pthread_detach(pthread_self());
while(1)
{
len=recv(*socketCtl2,buf,1024,0);
// printf("recv len : %d\n",len);
if(len<=0)
{
printf("recv error len=%d\n",len);
deleteMachNode(*socketCtl2);
close(*socketCtl2);
free(socketCtl2);
pthread_exit(NULL);
}
}
}
linux下一对多socket服务器端多线程泄露问题的更多相关文章
- Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
- Linux下的C Socket编程 -- 获取对方IP地址
Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...
- Linux下的C Socket编程 -- 简介与client端的处理
Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...
- Linux下高并发socket链接数测试
一.如何增大service进程的max open files ulimit -n 只能改小max open files,不能改大.需要按照以下步骤: 修改/etc/security/limits.co ...
- Linux下简单的socket通信实例
Linux下简单的socket通信实例 If you spend too much time thinking about a thing, you’ll never get it done. —Br ...
- linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到client的连接后,发送数据给client:clie ...
- Linux下高并发socket最大连接数所受的各种限制(详解)
1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每 ...
- linux下close 掉socket 之后 阻塞的recv 不会立即返回
转载自:http://www.cnblogs.com/wainiwann/p/3942203.html 在开发的一个基于rtmp聊天的程序时发现了一个很奇怪的现象. 在windows下当我们执行 cl ...
随机推荐
- xcode代码提示功能失效的解决方法
xcode 自动提示很好用 然而大量的工作也是让他吃不消了 结果今天提示功能给我来了个罢工 这当然是不行的 也是万能的搜索帮我解决了这个问题 方法很多 选择了简单的 xcode --> Wind ...
- 将字符串拆分为id
Sql : alter function [fn_splitSTR] ( ), -- 5,6,7 ) -- ',' ) )) as begin declare @splitlen int begin ...
- 网站后台调用winform MessageLoopApartment
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- HRBUST 1867 差分+BIT
我在群上看到的某道题,貌似用的是线段树,因为前几天遇到差分,再用BIT动态维护一下前缀和,感觉可做就A了. 加了个读优就Rank1啦! 某个不常见的题库,还是把题目拿下来把.. Description ...
- JavaScript原型学习笔记
1 理解JavaScript原型 什么是原型? 原型是一个对象,其他对象可以通过它实现属性继承. 任何一个对象都可以成为原型么? 是 哪些对象有原型 所有的对象在默认的情况下都有一个原型,因为原型本身 ...
- Linux线程-创建
Linux的线程实现是在内核以外来实现的,内核本身并不提供线程创建.但是内核为提供线程[也就是轻量级进程]提供了两个系统调用__clone()和fork (),这两个系统调用都为准备一些参数,最终都用 ...
- 解决CentOS6.4 Docker "Couldn't connect to Docker daemon ..." 问题
OS: CentOS6.4 #uname -r 2.6.32-504.1.3.el6.x86_64 安装完毕fig,并完成相应配置时执行如下命令出错(fig安装参见:http://www.fig.sh ...
- 史上最详细Windows版本搭建安装React Native环境配置 转载,比官网的靠谱亲测可用
史上最详细Windows版本搭建安装React Native环境配置 2016/01/29 | React Native技术文章 | Sky丶清| 95条评论 | 33530 views ...
- JS几种table切换
1.使用className <!doctype html> <html lang="en"> <head> <meta charset=& ...
- POJ 1094 (TopoSort)
http://poj.org/problem?id=1094 题意:该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列.是典型的拓扑排序,但输出格式上确有三种形式: 1.该字母序 ...