Socket.EndConnect doesn't throw expected exception

G

Guest

Greetings,

Hope I'm posting in the right group.

I set up a Socket with my local IP and a port on which nothing is listening.
When I use .Connect, I get the expected SocketException 10061 No connection
could be made because the target machine actively refused it.

Now, when I use .BeginConnect / .EndConnect no exception is thrown on
..EndConnect and the code continues. I get an error on .BeginReceive telling
me the Socket is not connected. If I try the .BeginConnect / .EndConnect a
second time, I do get the expected 10061 ErrorCode.

This behaves the same in .NET 1.1 and 2.0. Am I missing something or is
there a reason why the first .EndConnect does not throw an exception like I
expect it to?

Thanks,
Mike
 
V

Vadym Stetsyak

Strange... I cannot reproduce this situation...

Here is the code, it is based on .NET 2.0

namespace Client
{
class Program
{
public static ManualResetEvent allDone =
new ManualResetEvent(false);

public static void BeginConnect1(string host, int port)
{

IPAddress[] IPs = Dns.GetHostAddresses(host);

Socket s = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);

allDone.Reset();

Console.WriteLine("Establishing Connection to {0}",
host);
s.BeginConnect(IPs[0], port,
new AsyncCallback(ConnectCallback1), s);

// wait here until the connect finishes.
// The callback sets allDone.
allDone.WaitOne();

Console.WriteLine("Connection established");
}

public static void ConnectCallback1(IAsyncResult ar)
{
allDone.Set();
Socket s = (Socket)ar.AsyncState;
s.EndConnect(ar); //here i have the exception if noone is
listering on the remote address
}

static void Main(string[] args)
{
BeginConnect1("192.168.0.15", 6666);

Console.ReadLine();
}
}
}
 
G

Guest

Hello Vadym,

Thanks for the reply. I was not using a ManualResetEvent. Apparently that is
the problem. When I do use one, I get the exception as expected.

Then I took your code and removed the ManualResetEvent. I expected to get no
exception, but the exception still occurred.

I'm not sure what the difference is, although my code is a Windows Service
and not a console app.

Thanks,
Mike

Vadym Stetsyak said:
Strange... I cannot reproduce this situation...

Here is the code, it is based on .NET 2.0

namespace Client
{
class Program
{
public static ManualResetEvent allDone =
new ManualResetEvent(false);

public static void BeginConnect1(string host, int port)
{

IPAddress[] IPs = Dns.GetHostAddresses(host);

Socket s = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);

allDone.Reset();

Console.WriteLine("Establishing Connection to {0}",
host);
s.BeginConnect(IPs[0], port,
new AsyncCallback(ConnectCallback1), s);

// wait here until the connect finishes.
// The callback sets allDone.
allDone.WaitOne();

Console.WriteLine("Connection established");
}

public static void ConnectCallback1(IAsyncResult ar)
{
allDone.Set();
Socket s = (Socket)ar.AsyncState;
s.EndConnect(ar); //here i have the exception if noone is
listering on the remote address
}

static void Main(string[] args)
{
BeginConnect1("192.168.0.15", 6666);

Console.ReadLine();
}
}
}


--
Vadym Stetsyak aka Vadmyst
http://vadmyst.blogspot.com

Mike Hildner said:
Greetings,

Hope I'm posting in the right group.

I set up a Socket with my local IP and a port on which nothing is
listening.
When I use .Connect, I get the expected SocketException 10061 No
connection
could be made because the target machine actively refused it.

Now, when I use .BeginConnect / .EndConnect no exception is thrown on
.EndConnect and the code continues. I get an error on .BeginReceive
telling
me the Socket is not connected. If I try the .BeginConnect / .EndConnect a
second time, I do get the expected 10061 ErrorCode.

This behaves the same in .NET 1.1 and 2.0. Am I missing something or is
there a reason why the first .EndConnect does not throw an exception like
I
expect it to?

Thanks,
Mike
 
V

Vadym Stetsyak

I've removed event from the code, and guess what - I'm still getting
exception...

What is the value of Socket.Connected value, when connection callback is
called?

Maybe as a quick solution would be the check if
Socket.Connected == true....

--
Vadym Stetsyak aka Vadmyst
http://vadmyst.blogspot.com

Mike Hildner said:
Hello Vadym,

Thanks for the reply. I was not using a ManualResetEvent. Apparently that
is
the problem. When I do use one, I get the exception as expected.

Then I took your code and removed the ManualResetEvent. I expected to get
no
exception, but the exception still occurred.

I'm not sure what the difference is, although my code is a Windows Service
and not a console app.

Thanks,
Mike

Vadym Stetsyak said:
Strange... I cannot reproduce this situation...

Here is the code, it is based on .NET 2.0

namespace Client
{
class Program
{
public static ManualResetEvent allDone =
new ManualResetEvent(false);

public static void BeginConnect1(string host, int port)
{

IPAddress[] IPs = Dns.GetHostAddresses(host);

Socket s = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);

allDone.Reset();

Console.WriteLine("Establishing Connection to {0}",
host);
s.BeginConnect(IPs[0], port,
new AsyncCallback(ConnectCallback1), s);

// wait here until the connect finishes.
// The callback sets allDone.
allDone.WaitOne();

Console.WriteLine("Connection established");
}

public static void ConnectCallback1(IAsyncResult ar)
{
allDone.Set();
Socket s = (Socket)ar.AsyncState;
s.EndConnect(ar); //here i have the exception if noone
is
listering on the remote address
}

static void Main(string[] args)
{
BeginConnect1("192.168.0.15", 6666);

Console.ReadLine();
}
}
}


--
Vadym Stetsyak aka Vadmyst
http://vadmyst.blogspot.com

Mike Hildner said:
Greetings,

Hope I'm posting in the right group.

I set up a Socket with my local IP and a port on which nothing is
listening.
When I use .Connect, I get the expected SocketException 10061 No
connection
could be made because the target machine actively refused it.

Now, when I use .BeginConnect / .EndConnect no exception is thrown on
.EndConnect and the code continues. I get an error on .BeginReceive
telling
me the Socket is not connected. If I try the .BeginConnect /
.EndConnect a
second time, I do get the expected 10061 ErrorCode.

This behaves the same in .NET 1.1 and 2.0. Am I missing something or is
there a reason why the first .EndConnect does not throw an exception
like
I
expect it to?

Thanks,
Mike
 
V

Vadym Stetsyak

Can you post the code, where you're doing async connect?

--
Vadym Stetsyak aka Vadmyst
http://vadmyst.blogspot.com

Mike Hildner said:
Hello Vadym,

Thanks for the reply. I was not using a ManualResetEvent. Apparently that
is
the problem. When I do use one, I get the exception as expected.

Then I took your code and removed the ManualResetEvent. I expected to get
no
exception, but the exception still occurred.

I'm not sure what the difference is, although my code is a Windows Service
and not a console app.

Thanks,
Mike

Vadym Stetsyak said:
Strange... I cannot reproduce this situation...

Here is the code, it is based on .NET 2.0

namespace Client
{
class Program
{
public static ManualResetEvent allDone =
new ManualResetEvent(false);

public static void BeginConnect1(string host, int port)
{

IPAddress[] IPs = Dns.GetHostAddresses(host);

Socket s = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);

allDone.Reset();

Console.WriteLine("Establishing Connection to {0}",
host);
s.BeginConnect(IPs[0], port,
new AsyncCallback(ConnectCallback1), s);

// wait here until the connect finishes.
// The callback sets allDone.
allDone.WaitOne();

Console.WriteLine("Connection established");
}

public static void ConnectCallback1(IAsyncResult ar)
{
allDone.Set();
Socket s = (Socket)ar.AsyncState;
s.EndConnect(ar); //here i have the exception if noone
is
listering on the remote address
}

static void Main(string[] args)
{
BeginConnect1("192.168.0.15", 6666);

Console.ReadLine();
}
}
}


--
Vadym Stetsyak aka Vadmyst
http://vadmyst.blogspot.com

Mike Hildner said:
Greetings,

Hope I'm posting in the right group.

I set up a Socket with my local IP and a port on which nothing is
listening.
When I use .Connect, I get the expected SocketException 10061 No
connection
could be made because the target machine actively refused it.

Now, when I use .BeginConnect / .EndConnect no exception is thrown on
.EndConnect and the code continues. I get an error on .BeginReceive
telling
me the Socket is not connected. If I try the .BeginConnect /
.EndConnect a
second time, I do get the expected 10061 ErrorCode.

This behaves the same in .NET 1.1 and 2.0. Am I missing something or is
there a reason why the first .EndConnect does not throw an exception
like
I
expect it to?

Thanks,
Mike
 
G

Guest

Hello Vadym,

I hope my last post was clear.

You code (console application): Expected exception occurs, with or without
using ManualResetEvent.

My code (Windows server): Expected exception occurs only when using
ManualResetEvent

Here's the code from my service - with the ManualResetEvent.Set commented
out, the code does not throw an exception as (I think) it should.

private void ConnectToStateSwitchCallback(IAsyncResult ar)
{
try
{
// Retrieve the Socket and end the asynchronous connect
method.
//allDone.Set();
Socket s = (Socket)ar.AsyncState;
s.EndConnect(ar);

You are probably right in checking for Socket.Connected, I will look into
that as MSDN says "whether a Socket is connected to a remote host as of the
last Send or Receive operation." I have not sent or received data as of yet.

What I am doing is to call Socket.BeginReceive a few lines down in the
method snippet above. .BeginReceive will throw a SocketException.ErrorCode of
10057 - socket is not connected. I then try to connect again, and on the
second try, I get the expected exception - ErrorCode 10061.

Thank you for your time. This is not a huge issue for me, as I have two or
three ways to work around it right now. I'm just curious and trying to figure
exactly what is happening.

Vadym Stetsyak said:
Can you post the code, where you're doing async connect?

--
Vadym Stetsyak aka Vadmyst
http://vadmyst.blogspot.com

Mike Hildner said:
Hello Vadym,

Thanks for the reply. I was not using a ManualResetEvent. Apparently that
is
the problem. When I do use one, I get the exception as expected.

Then I took your code and removed the ManualResetEvent. I expected to get
no
exception, but the exception still occurred.

I'm not sure what the difference is, although my code is a Windows Service
and not a console app.

Thanks,
Mike

Vadym Stetsyak said:
Strange... I cannot reproduce this situation...

Here is the code, it is based on .NET 2.0

namespace Client
{
class Program
{
public static ManualResetEvent allDone =
new ManualResetEvent(false);

public static void BeginConnect1(string host, int port)
{

IPAddress[] IPs = Dns.GetHostAddresses(host);

Socket s = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);

allDone.Reset();

Console.WriteLine("Establishing Connection to {0}",
host);
s.BeginConnect(IPs[0], port,
new AsyncCallback(ConnectCallback1), s);

// wait here until the connect finishes.
// The callback sets allDone.
allDone.WaitOne();

Console.WriteLine("Connection established");
}

public static void ConnectCallback1(IAsyncResult ar)
{
allDone.Set();
Socket s = (Socket)ar.AsyncState;
s.EndConnect(ar); //here i have the exception if noone
is
listering on the remote address
}

static void Main(string[] args)
{
BeginConnect1("192.168.0.15", 6666);

Console.ReadLine();
}
}
}


--
Vadym Stetsyak aka Vadmyst
http://vadmyst.blogspot.com

Greetings,

Hope I'm posting in the right group.

I set up a Socket with my local IP and a port on which nothing is
listening.
When I use .Connect, I get the expected SocketException 10061 No
connection
could be made because the target machine actively refused it.

Now, when I use .BeginConnect / .EndConnect no exception is thrown on
.EndConnect and the code continues. I get an error on .BeginReceive
telling
me the Socket is not connected. If I try the .BeginConnect /
.EndConnect a
second time, I do get the expected 10061 ErrorCode.

This behaves the same in .NET 1.1 and 2.0. Am I missing something or is
there a reason why the first .EndConnect does not throw an exception
like
I
expect it to?

Thanks,
Mike
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top