socket监听 导致出错 求助!!

时间:2020-12-30 23:54:27
这是一个socket监听程序  并不是一直出错,开始运行挺正常,可能过几十分钟 或几小时会出现这样的错误,有时需要刷新一次程序页面才会继续监听端口,怎么优化一下

public void StartSocketAccept()
        {
            while (true)
            {
                mre.Reset();
                 _svrSocket.BeginAccept(new AsyncCallback(AcceptConn), _svrSocket);  ←这是那行代码
                mre.WaitOne();
            }
        }
下面是错误事件的描述
An unhandled exception occurred and the process was terminated.


Application ID: /LM/W3SVC/2/ROOT


Process ID: 6380


Exception: System.NullReferenceException


Message: Object reference not set to an instance of an object.


StackTrace:    at TcpSvr.StartSocketAccept() in d:\TcpSvr.cs:line 91
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

11 个解决方案

#1


while (true)
            {
                mre.Reset();
             
                mre.WaitOne();
            }

不是这么玩的,你while true了当然会挂
你只要这样写
public void StartSocketAccept()
 {
          _svrSocket.BeginAccept(new AsyncCallback(AcceptConn), _svrSocket);  ←这是那行代码
 }


然后在你的AcceptConn方法里加上上面的这个方法

AcceptConn (xxx xxxx)
{
    //这里是你的业务代码
    

  //末尾加重引引用StartSocketAccept() 方法
  StartSocketAccept();
}

#2


引用 1 楼 wyd1520 的回复:
while (true)
            {
                mre.Reset();
             
                mre.WaitOne();
            }

不是这么玩的,你while true了当然会挂
你只要这样写
public void StartSocketAccept()
 {
          _svrSocket.BeginAccept(new AsyncCallback(AcceptConn), _svrSocket);  ←这是那行代码
 }


然后在你的AcceptConn方法里加上上面的这个方法

AcceptConn (xxx xxxx)
{
    //这里是你的业务代码
    

  //末尾加重引引用StartSocketAccept() 方法
  StartSocketAccept();
}

好的 我试一下

#3


Object reference not set to an instance of an object.
socket监听 导致出错 求助!!

我X。你在Asp.net上写这个?_svrSocket 。。这对象被回收了。_svrSocket变成了null值了。

#4


引用 3 楼 wyd1520 的回复:
Object reference not set to an instance of an object.
socket监听 导致出错 求助!!

我X。你在Asp.net上写这个?_svrSocket 。。这对象被回收了。_svrSocket变成了null值了。

整套程序基本完成了,但是就是因为这句话会造成w3wp.exe意外终止,这样就不会正常持续监听端口,要刷新一次页面才可以。

#5


废话嘛,整个页面的生命周期都结束了,被回收掉了
你要开socket侦听,要写服务程序,而不是在网站里写这玩意

#6


引用 4 楼 u011283869 的回复:
Quote: 引用 3 楼 wyd1520 的回复:

Object reference not set to an instance of an object.
socket监听 导致出错 求助!!

我X。你在Asp.net上写这个?_svrSocket 。。这对象被回收了。_svrSocket变成了null值了。

整套程序基本完成了,但是就是因为这句话会造成w3wp.exe意外终止,这样就不会正常持续监听端口,要刷新一次页面才可以。


你还是放弃这样写吧。我最近也想试着这么搞,发现不行,只能用服务或WinFom来做这个,网页的保存不了,会被回收。

#7


不用运行页面,只在iis假设之后就可以监听端口,读取的数据存入session,然后存入数据库,不打开页面它还是会自动持续监听,就是运行一段时间后,w3wp.exe意外关闭,就监听不到数据了,在客户端打开一次页面就会继续监听接收数据

#8


该回复于2015-08-21 09:17:27被管理员删除

#9


每次并发请求都会用一个线程处理,如果都访问到你这个方法,你自己想想,IIS并发是有上限的,处理不完排队的请求就会无响应或者一直等待,你觉得这么做网站爽是么

#10


引用 6 楼 wyd1520 的回复:
Quote: 引用 4 楼 u011283869 的回复:

Quote: 引用 3 楼 wyd1520 的回复:

Object reference not set to an instance of an object.
socket监听 导致出错 求助!!

我X。你在Asp.net上写这个?_svrSocket 。。这对象被回收了。_svrSocket变成了null值了。

整套程序基本完成了,但是就是因为这句话会造成w3wp.exe意外终止,这样就不会正常持续监听端口,要刷新一次页面才可以。


你还是放弃这样写吧。我最近也想试着这么搞,发现不行,只能用服务或WinFom来做这个,网页的保存不了,会被回收。

这种情况我临时找到一个办法,globax 里面声明SOCKET对象
如果这里作为一个客户端,只要在服务端做一个刷新线程即可(IIS线程池回收有时间间隔的)只要在在时间范围内刷新一下任何网页 IIS就不会回收了(或者概率小)
如果作为服务器,服务器加个服务刷新页面也可以起到持久化的作用

#11


是设置问题,并不是这行代码导致出错,而是iis停止后这行代码无法运行,我自己找了下原来,优化了一下设置现在解决了,还是谢谢各位的帮助

#1


while (true)
            {
                mre.Reset();
             
                mre.WaitOne();
            }

不是这么玩的,你while true了当然会挂
你只要这样写
public void StartSocketAccept()
 {
          _svrSocket.BeginAccept(new AsyncCallback(AcceptConn), _svrSocket);  ←这是那行代码
 }


然后在你的AcceptConn方法里加上上面的这个方法

AcceptConn (xxx xxxx)
{
    //这里是你的业务代码
    

  //末尾加重引引用StartSocketAccept() 方法
  StartSocketAccept();
}

#2


引用 1 楼 wyd1520 的回复:
while (true)
            {
                mre.Reset();
             
                mre.WaitOne();
            }

不是这么玩的,你while true了当然会挂
你只要这样写
public void StartSocketAccept()
 {
          _svrSocket.BeginAccept(new AsyncCallback(AcceptConn), _svrSocket);  ←这是那行代码
 }


然后在你的AcceptConn方法里加上上面的这个方法

AcceptConn (xxx xxxx)
{
    //这里是你的业务代码
    

  //末尾加重引引用StartSocketAccept() 方法
  StartSocketAccept();
}

好的 我试一下

#3


Object reference not set to an instance of an object.
socket监听 导致出错 求助!!

我X。你在Asp.net上写这个?_svrSocket 。。这对象被回收了。_svrSocket变成了null值了。

#4


引用 3 楼 wyd1520 的回复:
Object reference not set to an instance of an object.
socket监听 导致出错 求助!!

我X。你在Asp.net上写这个?_svrSocket 。。这对象被回收了。_svrSocket变成了null值了。

整套程序基本完成了,但是就是因为这句话会造成w3wp.exe意外终止,这样就不会正常持续监听端口,要刷新一次页面才可以。

#5


废话嘛,整个页面的生命周期都结束了,被回收掉了
你要开socket侦听,要写服务程序,而不是在网站里写这玩意

#6


引用 4 楼 u011283869 的回复:
Quote: 引用 3 楼 wyd1520 的回复:

Object reference not set to an instance of an object.
socket监听 导致出错 求助!!

我X。你在Asp.net上写这个?_svrSocket 。。这对象被回收了。_svrSocket变成了null值了。

整套程序基本完成了,但是就是因为这句话会造成w3wp.exe意外终止,这样就不会正常持续监听端口,要刷新一次页面才可以。


你还是放弃这样写吧。我最近也想试着这么搞,发现不行,只能用服务或WinFom来做这个,网页的保存不了,会被回收。

#7


不用运行页面,只在iis假设之后就可以监听端口,读取的数据存入session,然后存入数据库,不打开页面它还是会自动持续监听,就是运行一段时间后,w3wp.exe意外关闭,就监听不到数据了,在客户端打开一次页面就会继续监听接收数据

#8


该回复于2015-08-21 09:17:27被管理员删除

#9


每次并发请求都会用一个线程处理,如果都访问到你这个方法,你自己想想,IIS并发是有上限的,处理不完排队的请求就会无响应或者一直等待,你觉得这么做网站爽是么

#10


引用 6 楼 wyd1520 的回复:
Quote: 引用 4 楼 u011283869 的回复:

Quote: 引用 3 楼 wyd1520 的回复:

Object reference not set to an instance of an object.
socket监听 导致出错 求助!!

我X。你在Asp.net上写这个?_svrSocket 。。这对象被回收了。_svrSocket变成了null值了。

整套程序基本完成了,但是就是因为这句话会造成w3wp.exe意外终止,这样就不会正常持续监听端口,要刷新一次页面才可以。


你还是放弃这样写吧。我最近也想试着这么搞,发现不行,只能用服务或WinFom来做这个,网页的保存不了,会被回收。

这种情况我临时找到一个办法,globax 里面声明SOCKET对象
如果这里作为一个客户端,只要在服务端做一个刷新线程即可(IIS线程池回收有时间间隔的)只要在在时间范围内刷新一下任何网页 IIS就不会回收了(或者概率小)
如果作为服务器,服务器加个服务刷新页面也可以起到持久化的作用

#11


是设置问题,并不是这行代码导致出错,而是iis停止后这行代码无法运行,我自己找了下原来,优化了一下设置现在解决了,还是谢谢各位的帮助