mono 3.10 Socket引发未知异常的悲剧事情...

最近在做mono 3.10针对socket性能方面的测试,在想对压力比较高的情况下发现了mono的一个bug会导致程序引发未知异常从而导致程序结束的严重问题.

错误信息

Unhandled Exception:
System.InvalidOperationException: EndSend can only be called once per
asynchronous operation
  at System.Net.Sockets.Socket.EndSend (IAsyncResult asyncResult,
System.Net.Sockets.SocketError& errorCode) [0x00000] in <filename unknown>:0
  at System.Net.Sockets.Socket.EndSend (IAsyncResult result) [0x00000] in
<filename unknown>:0
  at System.Net.Sockets.SocketAsyncEventArgs.SendCallback (IAsyncResult ares)
[0x00000] in <filename unknown>:0
  at System.Net.Sockets.SocketAsyncEventArgs.DispatcherCB (IAsyncResult ares)
[0x00000] in <filename unknown>:0
epoll(ADD): 9 Bad file descriptor

从代码上来看是由Socket.EndSend引发的异常没有被处理,看样子是由epoll导面抛出的.SocketAsyncEventArgs.SendCallback的处理代码如下:

internal void SendCallback (IAsyncResult ares)
		{
			try {
				BytesTransferred = curSocket.EndSend (ares);
			} catch (SocketException se){
				SocketError = se.SocketErrorCode;
			} catch (ObjectDisposedException) {
				SocketError = SocketError.OperationAborted;
			} finally {
				OnCompleted (this);
			}
		}

从代码上看来应该是有些异常没有处理,显然epool(add):9 Bad file descriptor应该是一个file io异常,由于以上代码没有catch....结果悲剧的事情发生了.(问题已经提交到mono团队,希望他们能处理一下这个问题)

时间: 2024-09-29 02:06:50

mono 3.10 Socket引发未知异常的悲剧事情...的相关文章

Socket中的异常和参数设置

1.常见异常 1.java.net.SocketTimeoutException . 这个异 常比较常见,socket 超时.一般有 2 个地方会抛出这个,一个是 connect 的 时 候 , 这 个 超 时 参 数 由connect(SocketAddress endpoint,int timeout) 中的后者来决定,还有就是 setSoTimeout(int timeout),这个是设定读取的超时时间.它们设置成 0 均表示无限大. 2.java.net.BindException:Ad

第 10 章 文件和异常

至此,我们掌握了编写组织有序而易于使用的程序所需的基本技能,该考虑让程序目标更明确,用途更大了.在本章中,我们将学习处理文件,让程序能够快速地分析大量的数据:我们将学习错误处理,避免程序在面对意外情形时崩溃:我们将学习异常,它们是Python创建的特殊对象,用于管理程序运行时出现的错误:我们还将学习模块json,它让我们能够保存用户数据,以免在程序停止运行后丢失. 学习处理文件和保存数据可以让我们的程序使用起来更容易:用户将能够选择输入什么样的数据,以及在什么时候输入:用户使用我们的程序做一些工

NIO设置SO_LINGER引发的异常

欢迎关注Github:https://github.com/teaey/ ### 背景 银时跟我讲,想从 Netty3迁移到Netty4 . 问其原因是因为 Netty3在容器里会报错,错误堆栈: java.io.IOException: 无法立即完成一个非阻止性套接字操作. at sun.nio.ch.SocketDispatcher.close0(Native Method) at sun.nio.ch.SocketDispatcher.preClose(SocketDispatcher.j

0x0F19B7EC (ucrtbased.dll)处(位于 ex6.exe 中)引发的异常: 0xC0000005: 写入位置 0x00740000 时发生访问冲突。

下面的代码在编译,运行时没有问题,在输入内容是出现异常如下: 0x0F19B7EC (ucrtbased.dll)处(位于 ex6.exe 中)引发的异常: 0xC0000005: 写入位置 0x00740000 时发生访问冲突. #include "stdafx.h"#include <conio.h>#include <stdio.h> int main(){ int NUM, I; struct STUDENT { char NAME[30]; int A

TCP端口复用引发的异常,用setsockopt来解决

TCP端口复用引发的异常,用setsockopt来解决 我们在并发连接一个服务端时候他会出现这种情况 OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次. 假如端口被socket使用过,并且利用socket.close()来关闭连接,但此时端口还没有释放,要经过一个TIME_WAIT的过程之后才能使用,这是TNN的相当烦银的,为了实现端口的马上复用,可以选择setsockopt()函数来达到. 端口复用的实现,我在这里用Python举个T

第10章-异常处理 --- Checked异常和Runtime异常体系

第10章-异常处理 --- Checked异常和Runtime异常体系 Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常).所有的RuntimeException类及其子类的实例被称为Runtime异常;不是RuntimeException类及其子类的异常实例则被称为Checked异常. 对于Checked异常的处理方法有如下两种: (1)当前方法明确知道如何处理该异常,程序应该用try...catch块来捕获该异常,然后在对应的catch块中修复该异常. (2)当

在MS单元测试中引发期望异常

首先准备一个引发异常的方法. 1 public static void ThrowException() 2 { 3 throw new ArgumentException(); 4 } 然后在单元测试项目中,写下测试方法. [TestMethod] [ExpectedException(typeof(ArgumentException))]// 构造函数中为期望引发的异常. public void ThrowExceptionTest() { Program.ThrowException();

centos6.5+jexus5.6.3+mono 3.10实践,让asp.net在linux上飞一会儿

备忘,这是给自己看的,用ubuntu server装mono 3.10老是卡在了编译libgdiplus上面,从来就没成功过,郁闷啊,零零散散搞了好几天,作罢.后来试了OpenSUSE 11很容易搞好了,但是不熟悉这个系统,后来坚持还想搞ubuntu server还是失败了,万般无耐,发行每回都是装的64位的ubuntu server,后来试32位的,还是不成功.后来就试centos了.一次成功.记录下来怕忘记了.要点是不能去git上down最新的源码,下个正式发布的tar包,就可以了. 步骤如

mono 3.10.0 正式发布:性能进一步改进

Mono是Xamarin资助的一个项目,是微软的.NET框架的开源实现.它使得使用C#.F#和其他.NET语言进行跨平台开发成为可能.Xamarin在Mono之上构建了跨平台开发工具以及像Xamarin.Forms(可以使用跨平台代码辅助创建原生的体验)这样的框架产品.开发工具和框架在开发者之间都有应用(Xamarin最近获得了5400万美元C轮融资,会继续在这方面发力).Xamarin也已经在和微软开展合作,以改进.NET和Mono之间的兼容性.ASP.NET vNext(尤其是KRuntim