98 lines
3.6 KiB
C#
98 lines
3.6 KiB
C#
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft Research Singularity
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// File: SocketException.cs
|
|
//
|
|
|
|
namespace System.Net.Sockets
|
|
{
|
|
using System;
|
|
using NetStack.Contracts;
|
|
|
|
public class SocketException : Exception {
|
|
SocketErrors _socketError;
|
|
|
|
public SocketException(int socketError)
|
|
: this((SocketErrors)socketError)
|
|
{
|
|
}
|
|
|
|
public SocketException(SocketErrors socketError)
|
|
: this(socketError, String.Format("SocketError: {0}", socketError.ToString()))
|
|
{
|
|
}
|
|
|
|
internal SocketException(SocketErrors socketError, string message)
|
|
: base(message)
|
|
{
|
|
_socketError = socketError;
|
|
}
|
|
|
|
public SocketErrors ErrorCode {
|
|
get { return _socketError; }
|
|
}
|
|
}
|
|
|
|
public class TcpException : SocketException
|
|
{
|
|
public TcpException(TcpError error, string message)
|
|
: base(GetSocketErrorForTcpError(error), message)
|
|
{
|
|
_tcpError = error;
|
|
}
|
|
|
|
public TcpException(TcpError error)
|
|
: this(error, GetMessageForTcpError(error))
|
|
{
|
|
}
|
|
|
|
readonly TcpError _tcpError;
|
|
|
|
public TcpError TcpError
|
|
{
|
|
get { return _tcpError; }
|
|
}
|
|
|
|
public static SocketErrors GetSocketErrorForTcpError(TcpError error)
|
|
{
|
|
switch (error) {
|
|
// These are defined in Contracts\NetStack.Contracts\TcpConnectionContract.sg.
|
|
case TcpError.Unknown: return SocketErrors.SocketError;
|
|
case TcpError.AlreadyConnected: return SocketErrors.WSAEISCONN;
|
|
case TcpError.Refused: return SocketErrors.WSAECONNREFUSED;
|
|
case TcpError.Reset: return SocketErrors.WSAECONNRESET;
|
|
case TcpError.Timeout: return SocketErrors.WSAETIMEDOUT;
|
|
case TcpError.ProtocolViolation: return SocketErrors.WSAECONNRESET;
|
|
case TcpError.ResourcesExhausted: return SocketErrors.SocketError;
|
|
case TcpError.Closed: return SocketErrors.WSAEDISCON;
|
|
|
|
default:
|
|
return SocketErrors.SocketError;
|
|
}
|
|
}
|
|
|
|
public static string GetMessageForTcpError(TcpError error)
|
|
{
|
|
switch (error) {
|
|
// These are defined in Contracts\NetStack.Contracts\TcpConnectionContract.sg.
|
|
case TcpError.Unknown: return "Unknown error";
|
|
case TcpError.AlreadyConnected: return "The connection is already in use.";
|
|
case TcpError.Refused: return "The remote host actively refused the connection.";
|
|
case TcpError.Reset: return "The connection was reset by the peer.";
|
|
case TcpError.Timeout: return "No response was received.";
|
|
case TcpError.ProtocolViolation: return "An invalid packet was received from the peer.";
|
|
case TcpError.ResourcesExhausted: return "Insufficient resources.";
|
|
case TcpError.Closed: return "The TCP connection has been closed.";
|
|
|
|
default:
|
|
return String.Format("Unknown TcpError code ({0}).", ((int)error).ToString());
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
} // namespace System.Net
|