summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cs/src/Ice/Network.cs12
-rw-r--r--cs/src/Ice/TcpTransceiver.cs1
-rw-r--r--cs/src/Ice/UdpTransceiver.cs51
3 files changed, 50 insertions, 14 deletions
diff --git a/cs/src/Ice/Network.cs b/cs/src/Ice/Network.cs
index 2580ae65ca8..961d214c9f6 100644
--- a/cs/src/Ice/Network.cs
+++ b/cs/src/Ice/Network.cs
@@ -993,8 +993,16 @@ namespace IceInternal
addressesToString(IPEndPoint localEndpoint, IPEndPoint remoteEndpoint)
{
System.Text.StringBuilder s = new System.Text.StringBuilder();
- s.Append("local address = " + localEndpoint.Address);
- s.Append(":" + localEndpoint.Port);
+ if(localEndpoint == null)
+ {
+ // This might occur if connect was not called yet, see also comments in doBeginConnectAsync
+ s.Append("local address = <not bound>");
+ }
+ else
+ {
+ s.Append("local address = " + localEndpoint.Address);
+ s.Append(":" + localEndpoint.Port);
+ }
if(remoteEndpoint == null)
{
diff --git a/cs/src/Ice/TcpTransceiver.cs b/cs/src/Ice/TcpTransceiver.cs
index 98d256c1262..704d99c8da3 100644
--- a/cs/src/Ice/TcpTransceiver.cs
+++ b/cs/src/Ice/TcpTransceiver.cs
@@ -54,6 +54,7 @@ namespace IceInternal
{
Debug.Assert(_result != null);
Network.doEndConnectAsync(_result);
+ _result = null;
_state = StateConnected;
_desc = Network.fdToString(_fd);
if(_traceLevels.network >= 1)
diff --git a/cs/src/Ice/UdpTransceiver.cs b/cs/src/Ice/UdpTransceiver.cs
index 814c3f3649f..06efcc3131e 100644
--- a/cs/src/Ice/UdpTransceiver.cs
+++ b/cs/src/Ice/UdpTransceiver.cs
@@ -31,9 +31,39 @@ namespace IceInternal
public bool initialize(AsyncCallback callback)
{
- //
- // Nothing to do.
- //
+ if(!_incoming)
+ {
+ if(_connect)
+ {
+ Debug.Assert(callback != null);
+ Debug.Assert(_addr != null);
+
+ _connect = false;
+ _result = Network.doBeginConnectAsync(_fd, _addr, callback);
+
+ if(!_result.CompletedSynchronously)
+ {
+ //
+ // Return now if the I/O request needs an asynchronous callback.
+ //
+ return false;
+ }
+ }
+
+ if(!_connect)
+ {
+ Debug.Assert(_result != null);
+ Network.doEndConnectAsync(_result);
+ _result = null;
+ if(_traceLevels.network >= 1)
+ {
+ string s = "starting to send udp packets\n" + ToString();
+ _logger.trace(_traceLevels.networkCat, s);
+ }
+ }
+
+ Debug.Assert(!_connect);
+ }
return true;
}
@@ -516,15 +546,15 @@ namespace IceInternal
_stats = instance.initializationData().stats;
_warn = instance.initializationData().properties.getPropertyAsInt("Ice.Warn.Datagrams") > 0;
_addr = addr;
- _connect = false;
+ _connect = true;
+ _incoming = false;
try
{
_fd = Network.createSocket(true, _addr.AddressFamily);
setBufSize(instance);
Network.setBlock(_fd, false);
- bool connected = Network.doConnect(_fd, _addr);
- Debug.Assert(connected);
+
if(Network.isMulticast(_addr))
{
Network.setMcastGroup(_fd, _addr.Address, mcastInterface);
@@ -534,12 +564,6 @@ namespace IceInternal
Network.setMcastTtl(_fd, mcastTtl, _addr.AddressFamily);
}
}
-
- if(_traceLevels.network >= 1)
- {
- string s = "starting to send udp packets\n" + ToString();
- _logger.trace(_traceLevels.networkCat, s);
- }
}
catch(Ice.LocalException)
{
@@ -558,6 +582,7 @@ namespace IceInternal
_stats = instance.initializationData().stats;
_connect = connect;
_warn = instance.initializationData().properties.getPropertyAsInt("Ice.Warn.Datagrams") > 0;
+ _incoming = true;
try
{
@@ -692,12 +717,14 @@ namespace IceInternal
private Ice.Logger _logger;
private Ice.Stats _stats;
private bool _connect;
+ private bool _incoming;
private readonly bool _warn;
private int _rcvSize;
private int _sndSize;
private Socket _fd;
private IPEndPoint _addr;
private bool _mcastServer = false;
+ private IAsyncResult _result;
//
// The maximum IP datagram size is 65535. Subtract 20 bytes for the IP header and 8 bytes for the UDP header