<div dir="ltr"><div>I have a straightforward issue: If you supply an IPv4 address to a new AmqpTcpEndpoint in an IPv6-enabled Windows environment (Windows7) then pass that endpoint to a connection factory it will not be able to create connections.  It seems that if the client environment supports IPv6 you have to use an IPv6 address or a hostname.  My sample code is running the 3.3.0 RabbitMQ .Net client:</div><div><br></div><div><div>var factory = new ConnectionFactory() </div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>UserName = "eric",</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>Password = "pwd" </div><div>};</div><div><br></div><div><br></div><div>// WORKS (ipv6 addr)</div><div>// var uri = new Uri("amqp-0-9://[2001:a9fe:3100:1:f06c:255a:43e2:1459]:5672");</div><div><br></div><div>// WORKS (hostname)</div><div>// var uri = new Uri("amqp-0-9://s6-2k8r2-3:5672");</div><div><br></div><div>// Times out (mapped ipv4 [socket is probably not dual-stack?])</div><div>// var uri = new Uri("amqp-0-9://[0:0:0:0:0:ffff:172.31.195.246]:5672");</div><div><br></div><div>// Throws a System.ArgumentException in CreateConnection()</div><div>var uri = new Uri("amqp-0-9://172.31.195.246:5672");</div><div><br></div><div>factory.Endpoint = new AmqpTcpEndpoint(uri);</div><div><br></div><div>using (var connection = factory.CreateConnection())</div><div>{</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>using (var channel = connection.CreateModel())</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>channel.QueueDeclare("test", false, false, false, null);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">          </span>string message = "Hello World";</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>var body = Encoding.UTF8.GetBytes(message);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">         </span>channel.BasicPublish("", "hello", null, body);</div><div><span class="Apple-tab-span" style="white-space:pre">           </span>Console.WriteLine(" [x] Sent {0}", message);</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>}</div><div>}</div></div><div><br></div><div>The problem appears to be in the way the SocketFrameHandler_0_9.ctor() determines the socket address family:</div><div><br></div><div><div>if (Socket.OSSupportsIPv6)</div><div>    {</div><div>        try</div><div>        {</div><div>            this.m_socket = socketFactory(AddressFamily.InterNetworkV6);</div><div>            this.Connect(this.m_socket, endpoint, timeout);</div><div>        }</div><div>        catch (ConnectFailureException)</div><div>        {</div><div>            this.m_socket = null;</div><div>        }</div><div>    }</div></div><div><br></div><div><br></div><div>This may not be the best way to determine whether to use an IPv6 socket or an IPv4 socket.  The ArgumentException which is getting thrown from down in the Socket's DoDnsCallback is not caught in the FrameHandler ctor and instead makes its way up to the caller.  You may want to consider IPAddress.TryParsing the host from the Amqp endpoint and then getting the address family from that.  It would probably be faster than this method, too.</div><div><br></div><div>As it stands I cannot figure out a workaround for this issue.  If the only way you can access a machine from an IPv6-enabled Windows box is via its IPv4 address you would appear to be out of luck.  In the .Net client, anyway.</div><div><br></div><div>Thanks,</div><div>Eric</div><div><br></div></div>