diff options
-rw-r--r-- | cs/src/Ice/Network.cs | 12 | ||||
-rw-r--r-- | cs/src/Ice/TcpTransceiver.cs | 1 | ||||
-rw-r--r-- | cs/src/Ice/UdpTransceiver.cs | 51 |
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 |