C# socket编程 出现 System.OutOfMemoryException 错误

newlovedew 2014-06-17 08:24:31
问题描述:ListenClientConnect过程 Exception of type 'System.OutOfMemoryException' was thrown.
运行环境:有100多个客户端,不出意外,长时间在线,心跳包是60秒一个,数据是5分钟一个
代码如下 之前出现过类似问题 加了GC.Collect(); 但是还是没解决

private void ListenClientConnect(object ServerSocket)
{
while (true)
{
try
{
Socket socket = (Socket)ServerSocket;
Socket clientSocket = socket.Accept();
Thread receiveThread = new Thread(receivesocketmessage);
receiveThread.IsBackground = true;
receiveThread.Start(clientSocket);
}
catch (Exception er) { Wlog wlog = new Wlog(); wlog.errlog("ListenClientConnect" + " " + er.Message); GC.Collect(); }
}
}
private void receivesocketmessage(object clientSocket)
{
Socket myClientSocket = (Socket)clientSocket;
byte[] result=new byte[1024];
DateTime dt = DateTime.Now;
while (true)
{
try
{
if ((DateTime.Now - dt).TotalSeconds > 70)
{
myClientSocket.Shutdown(SocketShutdown.Both);
myClientSocket.Close();
break;
} //根据超时时间结束线程
int receiveNumber = 0;
//通过clientSocket接收数据
try
{
receiveNumber = myClientSocket.Receive(result);
}
catch (Exception er)
{
Wlog wlog = new Wlog(); wlog.errlog("myClientSocket.Receive " + er.Message);
myClientSocket.Shutdown(SocketShutdown.Both);
myClientSocket.Close();
break;
}
//Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber));
string str = "";
if (receiveNumber > 0)
{
dt = DateTime.Now;
for (int i = 0; i < receiveNumber; i++)
{ str += result[i].ToString("X").PadLeft(2, '0'); }
jiexiPara jp = new jiexiPara(str, DateTime.Now, 1, "");
baowenjiexi(jp, clientSocket);
}
}
catch (Exception er) { Wlog wlog = new Wlog(); wlog.errlog("receivesocketmessage "+er.Message); }
//Thread.Sleep(80);
}
GC.Collect();
}
...全文
696 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
第十一次进球 2016-06-03
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
编程不是什么高级的工作,编程的目的就是让针对自己的测试能够通过。你应该自己对源代码进行测试和调试,然后给别人贴出真正的问题来。
很多地方都能见到你的回答,但是却没有见过一个回答能够解决问题的。都是泛泛而谈,不能解决实际问题,不知道这样浪费时间有什么意义呢
b493173720 2015-04-02
  • 打赏
  • 举报
回复
你的这个问题解决了没? 我现在也碰到类似的问题
newlovedew 2014-06-27
  • 打赏
  • 举报
回复
引用 7 楼 smthgdin 的回复:
异常日志写得不详细啊。ex.message给出的信息是不够的,一般来说异常的日志最好是ex.ToString(),这样可以获得堆栈信息,这样你就可以知道是哪个方法抛出的异常,然后在抛异常的方法里设置断点,调试就知道了。
用了你说的方法,日志如下 ListenClientConnect System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. at System.Threading.Thread.StartInternal(IPrincipal principal, StackCrawlMark& stackMark) at System.Threading.Thread.Start(StackCrawlMark& stackMark) at System.Threading.Thread.Start(Object parameter) at ShujuJieShou.Frmmain.ListenClientConnect(Object ServerSocket)
newlovedew 2014-06-27
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
你连哪一行抛出异常都不知道,我相信你更没有调试过抛出异常的行中的各种变量,以及顺着调用堆栈去逐层分析变量吧?! 删除你的try....catch,写实际的测试程序去反复、打乱次序、随机数据、并行地测试1万次,然后使用vs调试器去调试你的程序。 最初级地编程技能,你得知道异常抛自哪一行、哪一个变量上吧?!
你好 错误日志如下 ListenClientConnect System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. at System.Threading.Thread.StartInternal(IPrincipal principal, StackCrawlMark& stackMark) at System.Threading.Thread.Start(StackCrawlMark& stackMark) at System.Threading.Thread.Start(Object parameter) at ShujuJieShou.Frmmain.ListenClientConnect(Object ServerSocket) 这个能看出来点什么么?
newlovedew 2014-06-18
  • 打赏
  • 举报
回复
引用 7 楼 smthgdin 的回复:
异常日志写得不详细啊。ex.message给出的信息是不够的,一般来说异常的日志最好是ex.ToString(),这样可以获得堆栈信息,这样你就可以知道是哪个方法抛出的异常,然后在抛异常的方法里设置断点,调试就知道了。
好的
newlovedew 2014-06-18
  • 打赏
  • 举报
回复
引用 6 楼 CGabriel 的回复:
可能性很多,最大的是内存碎片太多。 可以尝试一下重用那个长度为 1024 的缓冲区。 线程太多也可能是个问题,要不尝试一下用异步?
内存碎片这个还不太了解。 我看网上也有人说用异步,但是想找出问题所在
newlovedew 2014-06-18
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
编程不是什么高级的工作,编程的目的就是让针对自己的测试能够通过。你应该自己对源代码进行测试和调试,然后给别人贴出真正的问题来。
正在测试。。。
SwingingMace 2014-06-18
  • 打赏
  • 举报
回复
同样在做Socket程序,没遇到过这个问题,帮顶。指出一个问题: myClientSocket.Shutdown(SocketShutdown.Both); 这段代码在网络中断时会报错。
smthgdin_020 2014-06-17
  • 打赏
  • 举报
回复
异常日志写得不详细啊。ex.message给出的信息是不够的,一般来说异常的日志最好是ex.ToString(),这样可以获得堆栈信息,这样你就可以知道是哪个方法抛出的异常,然后在抛异常的方法里设置断点,调试就知道了。
CGabriel 2014-06-17
  • 打赏
  • 举报
回复
可能性很多,最大的是内存碎片太多。 可以尝试一下重用那个长度为 1024 的缓冲区。 线程太多也可能是个问题,要不尝试一下用异步?
  • 打赏
  • 举报
回复
编程不是什么高级的工作,编程的目的就是让针对自己的测试能够通过。你应该自己对源代码进行测试和调试,然后给别人贴出真正的问题来。
  • 打赏
  • 举报
回复
你连哪一行抛出异常都不知道,我相信你更没有调试过抛出异常的行中的各种变量,以及顺着调用堆栈去逐层分析变量吧?! 删除你的try....catch,写实际的测试程序去反复、打乱次序、随机数据、并行地测试1万次,然后使用vs调试器去调试你的程序。 最初级地编程技能,你得知道异常抛自哪一行、哪一个变量上吧?!
newlovedew 2014-06-17
  • 打赏
  • 举报
回复
自己顶一下 !
newlovedew 2014-06-17
  • 打赏
  • 举报
回复
请各位帮帮忙
newlovedew 2014-06-17
  • 打赏
  • 举报
回复
小弟反复检查,没有发现实质性错误,ListenClientConnect过程虽然每当有新请求就会创建新的线程,但是在receivesocketmessage过程中已经对无效的线程做了结束处理了,应该不会有的线程存在,为什么会提示内存溢出呢????

111,092

社区成员

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

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

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