救命啊,如果这个问题不解决,整项目就完了! 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作(Remoting)

yhy0611 2008-11-03 10:06:54
系统中五个服务器,互相通信使用Remoting。Remoting的服务器端使用Windows服务,五个服务器作为Remoting的客户端。其实Windows服务什么都没作,每个方法中就是触发一个事件,来传递消息。如果这个Windows服务出现问题,那么,整个系统就将瘫痪!

我在网上找了一下,原因可能Socket缓冲区大小的问题,或者是Socket没有及时的释放资源。可是我现在用的是Remoting,关于Socket的部分己经封装好了,我没有办法来控制。请问这个问题如何解决。

另外说一下,远程对象的租用周期为无限,不知道跟这个有没有关系。还有一点就是,我以前测试的时候我没发现这个问题,最近两天在测试的时候我开着BT在下东东(啥东东就不说了^^)。

Remoting服务器端代码

protected override void OnStart(string[] args)
{
BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;

IDictionary props = new Hashtable();
props["name"] = "YuHaiYang";
props["bindTo"] = ServerIp;
props["port"] = 8080;
props["rejectRemoteRequests"] = false;

TcpChannel tcpChannel = new TcpChannel(props, clientProvider, serverProvider);
this.GpsRemoteObj = new GpsRemote();
ObjRef objRef = RemotingServices.Marshal(GpsRemoteObj, "GPSRemoteServer.soap");
}


Remoting各个客户端注册的代码

BinaryServerFormatterSinkProvider serverProvider = new BinaryServerFormatterSinkProvider();
BinaryClientFormatterSinkProvider clientProvider = new BinaryClientFormatterSinkProvider();
serverProvider.TypeFilterLevel = TypeFilterLevel.Full;

IDictionary props = new Hashtable();


TcpChannel tcpChannel = null;
try
{
props["name"] = "YuHaiYang";
props["bindTo"] = this.objGatewayApplication.RemotingIp;
props["port"] = this.objGatewayApplication.LocalHostPort;
props["rejectRemoteRequests"] = false;
tcpChannel = new TcpChannel(props, clientProvider, serverProvider);
}
catch{}
ChannelServices.RegisterChannel(tcpChannel, false);

this.eventWrapper = new EventWrapper();
this.iGpsRemote = (IGpsRemote)Activator.GetObject(typeof(IGpsRemote), "tcp://" + this.objGatewayApplication.RemotingIp + ":" + this.objGatewayApplication.RemotingPort + "/GPSRemoteServer.soap");



下面是在调用远程对象中方法的一段代码,就是在这里出的错:(


this.iGpsRemote.SendCarOutMessage(obj.ClientName);

错误信息如下:

在 System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
在 System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
在 System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket(EndPoint ipEndPoint)
在 System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket()
在 System.Runtime.Remoting.Channels.SocketCache.GetSocket(String machinePortAndSid, Boolean openNew)
在 System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.SendRequestWithRetry(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream)
在 System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
在 System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)

Exception rethrown at [0]:
在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
在 DqhlGps.Common.IGpsRemote.SendAnalData(MessageForAnalyze e, Object sender)
在 DqhlGps.AnalyzeAgent.frmAnalyzeAgent_Main.objDataAnaly_OnSendAnalyDataToAppEvent(MessageForAnalyze e, Object sender) 位置 J:\监控系统\DqhlGps.AnalyzeAgent\DqhlGps.AnalyzeAgent\frmAnalyzeAgent_Main.cs:行号 331
...全文
1811 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyt_yang 2009-12-08
  • 打赏
  • 举报
回复
你可以使用tcpview查看下系统的端口占用情况,再开下系统内存资源的使用率,看哪个程序占用的最多,然后再分析下,我也遇到了类似的问题,是因为通信使用短连接,资源释放有问题,也就出现了类似的情况
yhy0611 2008-11-15
  • 打赏
  • 举报
回复
感谢大家的回答,我到现在也没找到问题的原因,但是
但是
但是
但是
但是
但是
但是
但是
但是
但是
但是
但是
但是
但是 我换了一台服务器,居然好使了!我倒!!!!
  • 打赏
  • 举报
回复
这是表面现象。异常抛出导致的错误,有两种,一种就是立即反馈出来,这种错误往往你能知道具体的错误原因在哪里。另外一种就是错误的积累,等到一定程度就会报出来。特别是在网络编程方面容易发生,而且看上去很偶然,debug的时候往往都是正确的。你的这个错误凭我的感觉和经验,像第二种。
remoting虽然不容易调试,但它本身不会有多少缺陷的,包括socket,,不会说存在这种莫名其妙的bug,出了问题我觉得首先要从自己写的代码上去找错误。
我用wcf的时候,也报过你这样的错误。我曾经也怀疑过wcf,甚至还在别人面前大放厥词说wcf很烂。但错误终究还是要去找原因想办法纠正,最后的结果是我自己写的代码有问题。
yhy0611 2008-11-07
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 tmxk2002 的回复:]
remoting没弄过,一直用的WCF。
听说remoting是比较难调试,从你的错误以及现象来看,不见得是socket或者remoting本身的问题,有可能是你们自己写的程序报错,但没有把错误扑捉,直接抛给了remoting。导致remoting爆出这个错误。建议你从你们自己写的代码着手,试着凡是remoting背后的那层代码都主动trycatch住然后打入日志,保证不把错误抛给remoting。
[/Quote]

很感谢您的提示。
但我是在调用远程对象的方法时发生的错误,错误是什么?错误不是在远程对象的方法中产生的,而是在我客户端发出请求的时候。Remoting的底下还不是Socket

再看一下这些错误


在 System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
在 System.Net.Sockets.Socket.Connect(EndPoint remoteEP)

在 System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket(EndPoint ipEndPoint)
在 System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket()
在 System.Runtime.Remoting.Channels.SocketCache.GetSocket(String machinePortAndSid, Boolean openNew)
在 System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.SendRequestWithRetry(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream)
在 System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
在 System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)

Exception rethrown at [0]:
在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
在 DqhlGps.Common.IGpsRemote.SendAnalData(MessageForAnalyze e, Object sender)
在 DqhlGps.AnalyzeAgent.frmAnalyzeAgent_Main.objDataAnaly_OnSendAnalyDataToAppEvent(MessageForAnalyze e, Object sender)
yhy0611 2008-11-07
  • 打赏
  • 举报
回复
找到一个设置timeout属性的地方,希望能解决这个问题。明天看测试结果吧
yhy0611 2008-11-07
  • 打赏
  • 举报
回复
tmxk2002 也许你说的对,我应该从另一个角度来考虑问题,也许就有办法了。

http://topic.csdn.net/u/20081107/16/18d2c554-e39f-4ac0-85f8-f61fe8c9615f.html
烈火蜓蜻 2008-11-06
  • 打赏
  • 举报
回复
服务端,写有挺复杂的,给你一个简单的试试,也许问题就很简单了
在app.config 文件的configuration结点下添加以下内容

<system.runtime.remoting>
<application name="DemoRemoting">
<service>
<!--mode为调用方式-->
<wellknown mode="SingleCall"
type="Microsoft.Interface.RemotingImpl.InvokeBOSS,Microsoft.Interface.RemotingImpl"
objectUri="InvokeBOSS" /><!--remoting远程对象全类名,以及他的程序集名称-->
<wellknown mode="SingleCall"
type="Microsoft.Interface.RemotingImpl.InvokeSI,Microsoft.Interface.RemotingImpl"
objectUri="InvokeSI" /><!--remoting远程对象全类名,以及他的程序集名称-->
</service>
<channels>
<channel ref="tcp"
port="9000"> <!--监听端口-->
<serverProviders>
<formatter ref="binary"
typeFilterLevel="Full" />
</serverProviders>
</channel>
</channels>
</application>
</system.runtime.remoting>

然后在onstart里只要这几行就好了,当然Microsoft.Interface.RemotingImpl.InvokeBOSS这个是自己写的类(继承自MarshalByRefObject类)

protected override void OnStart( string[] args )
{
Thread work = new Thread( new ThreadStart( WorkThread ) );
work.Start();
}

/// <summary>
///
/// </summary>
private void WorkThread()
{
try
{
System.Runtime.Remoting.RemotingConfiguration.Configure( AppDomain.CurrentDomain.BaseDirectory + "当前项目的名.exe.config", false );
}
catch ( Exception ex )
{
//异常处理
}
}
lazyboysqaz 2008-11-06
  • 打赏
  • 举报
回复
哎,不懂啊,帮顶
yhy0611 2008-11-06
  • 打赏
  • 举报
回复
难道是我中了病毒?
yhy0611 2008-11-06
  • 打赏
  • 举报
回复
我晕,贴子要沉了
yhy0611 2008-11-06
  • 打赏
  • 举报
回复
今天早上用netstat看了一下,没有发现任何异常
  • 打赏
  • 举报
回复
remoting没弄过,一直用的WCF。
听说remoting是比较难调试,从你的错误以及现象来看,不见得是socket或者remoting本身的问题,有可能是你们自己写的程序报错,但没有把错误扑捉,直接抛给了remoting。导致remoting爆出这个错误。建议你从你们自己写的代码着手,试着凡是remoting背后的那层代码都主动trycatch住然后打入日志,保证不把错误抛给remoting。
hanyu0528 2008-11-05
  • 打赏
  • 举报
回复
不会,帮顶吧~!!!
hei_an 2008-11-05
  • 打赏
  • 举报
回复
类名好长........
yhy0611 2008-11-05
  • 打赏
  • 举报
回复
问题肯定是出在Remoting上,这个现在己经可以完全确定!等下次再出现问题的时候我看一上netstat吧,今天又忘了。
极度郁闷ing.....................
danjiewu 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yhy0611 的回复:]
引用 5 楼 zswang 的回复:
灌水灌错地了。。。

不能搭建调试环境的东东不好弄,有简化的可调试代码demo吗?

先标记一下。。。


另外这东东还要GPS终端才能调试,模拟的环境倒是有,不过整个环境搭起来很劲力,能不能想想别的办法?
[/Quote]

只需要提供一个demo,其实你也可以自己建一个简化的工程,去掉gps什么不相干的模块,再测试一下,判断是那部分的问题。
yhy0611 2008-11-05
  • 打赏
  • 举报
回复
难道这根我的计算机设置有关?
ximi82878 2008-11-05
  • 打赏
  • 举报
回复
好深奥的问题啊,帮顶个~~~
yhy0611 2008-11-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 guoyx 的回复:]
你把BT关闭试看看,是不是你的BT把windows的缓冲区占满了?或者是把socket资源消耗完,你连接时候不能创建socket对象.
[/Quote]

这次测试我没开BT,结果还是报错.............
paulin 2008-11-04
  • 打赏
  • 举报
回复
up
加载更多回复(13)

110,561

社区成员

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

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

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