c# socket 正常使用半天 程序会自动关闭

蓝人(mycls) 2014-04-06 06:30:26
放在windows 2008server 上的,16G内存 半天就自动挂掉了,报错CLR20r3 和System.OutOfMemoryException

IPAddress ip1;
private bool isExit = false;
TcpListener listener;
private ManualResetEvent allDone = new ManualResetEvent(false);

myThread = new Thread(new ThreadStart(AcceptConnection));
myThread.Start();

private void AcceptConnection()
{

IPHostEntry ipHost = Dns.Resolve(Dns.GetHostName());
ipHost.AddressList[0];
ip1 = IPAddress.Parse("172.19.58.164");

listener = new TcpListener(ip1, 3001);

listener.Start();
while (isExit == false)
{
try
{
allDone.Reset();
Application.DoEvents();
AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallBack);
listener.BeginAcceptTcpClient(callback, listener);
allDone.WaitOne();
}
catch (Exception e)
{
break;
}
}
}

private void AcceptTcpClientCallBack(IAsyncResult iar)
{
try
{
allDone.Set();
TcpListener mylistener = (TcpListener)iar.AsyncState;
TcpClient client = mylistener.EndAcceptTcpClient(iar);
DataReadWrite datareadwrite = new DataReadWrite(client);
datareadwrite.ns.BeginRead(datareadwrite.read, 0, datareadwrite.read.Length, ReadCallBack, datareadwrite);
}
catch (Exception e)
{
return;
}
}

private void ReadCallBack(IAsyncResult iar)
{
string revstring = string.Empty;
string msg = string.Empty;
try
{
DataReadWrite datareadwrite = (DataReadWrite)iar.AsyncState;
int recv = datareadwrite.ns.EndRead(iar);
revstring.Remove(0, revstring.Length);
revstring = Encoding.UTF8.GetString(datareadwrite.read, 0, recv);
if (revstring.Length != 0)
{
msg.Remove(0, msg.Length);
msg += System.Environment.NewLine + "收到客户端请求:" + " " + datareadwrite.client.Client.RemoteEndPoint +" "+ revstring + " " + Convert.ToString(DateTime.Now);
//显示到界面
_bllSeRs.ShowFunctionReturnParameter(msg);
revstring = StrToCommand(revstring);
SendString(datareadwrite, revstring);
}
if (isExit == false)
{
datareadwrite.InitReadArray();
datareadwrite.ns.BeginRead(datareadwrite.read, 0, datareadwrite.read.Length, ReadCallBack, datareadwrite);
}
}
catch (Exception e)
{
}
}
...全文
396 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wmg494005678 2014-04-08
  • 打赏
  • 举报
回复
内存溢出的问题,感觉还是要靠一些工具来检测,推荐WinDbg,一般多是资源释放的问题, 推荐一下这个博客:http://www.cnblogs.com/StevenChennet/archive/2012/07/24/2606780.html 我当时内存泄露就是根据这个捉虫记1的方法解决的,多抓几次Dump,比较一下Heap堆上对象的个数,一般 最后一次,与前面相比,个数明显增多的就是元凶
蓝人(mycls) 2014-04-08
  • 打赏
  • 举报
回复
三天了。。。。救命啊
hanhualangzi 2014-04-06
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
至于你随便扔出一个异常信息来,谁也不知道怎么回事。只能猜到,在工程方面的问题,很容易会造成这类问题。
本拉灯 2014-04-06
  • 打赏
  • 举报
回复
DataReadWrite 这个造成内存无限增加
蓝人(mycls) 2014-04-06
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
你可以现在本地对于服务程序进行并发自动测试,你可以模拟100个线程、每个线程把100个测试用例以随机顺序(并且最好以随机生成的测试数据)执行测试1万次。 每天都要进行上万自动化测试,这样的服务才敢发布给用户用啊。
能否帮我分析一下,那里会引起内存溢出呢
  • 打赏
  • 举报
回复
至于你随便扔出一个异常信息来,谁也不知道怎么回事。只能猜到,在工程方面的问题,很容易会造成这类问题。
  • 打赏
  • 举报
回复
你可以现在本地对于服务程序进行并发自动测试,你可以模拟100个线程、每个线程把100个测试用例以随机顺序(并且最好以随机生成的测试数据)执行测试1万次。 每天都要进行上万自动化测试,这样的服务才敢发布给用户用啊。
蓝人(mycls) 2014-04-06
  • 打赏
  • 举报
回复
刚学C# 另外想问一下,这个算是多线程么,如果不是要怎么弄, 现在这个服务器8台电脑同时访问,每台电脑(1 分钟左右)收/发五条指令的样子,

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧