public void Bind([NotNull] string addr)
{
CheckContextTerminated();
// Process pending commands, if any.
ProcessCommands(0, false);
string protocol;
string address;
DecodeAddress(addr, out address, out protocol);
CheckProtocol(protocol);
switch (protocol)
{
case Address.InProcProtocol:
{
var endpoint = new Ctx.Endpoint(this, m_options);
bool addressRegistered = RegisterEndpoint(addr, endpoint);
if (!addressRegistered)
throw new AddressAlreadyInUseException(string.Format("Cannot bind address ( {0} ) - already in use.", addr));
m_options.LastEndpoint = addr;
return;
}
case Address.PgmProtocol:
case Address.EpgmProtocol:
{
if (m_options.SocketType == ZmqSocketType.Pub || m_options.SocketType == ZmqSocketType.Xpub)
{
// For convenience's sake, bind can be used interchangeable with
// connect for PGM and EPGM transports.
Connect(addr);
return;
}
break;
}
}
// Remaining transports require to be run in an I/O thread, so at this
// point we'll choose one.
var ioThread = ChooseIOThread(m_options.Affinity);
if (ioThread == null)
throw NetMQException.Create(ErrorCode.EmptyThread);
switch (protocol)
{
case Address.TcpProtocol:
{
var listener = new TcpListener(ioThread, this, m_options);
try
{
listener.SetAddress(address);
m_port = listener.Port;
// Recreate the address string (localhost:1234) in case the port was system-assigned
addr = string.Format("tcp://{0}:{1}",
address.Substring(0, address.IndexOf(':')),
m_port);
}
catch (NetMQException ex)
{
listener.Destroy();
EventBindFailed(addr, ex.ErrorCode);
throw;
}
m_options.LastEndpoint = listener.Address;
AddEndpoint(addr, listener, null);
break;
}
case Address.PgmProtocol:
case Address.EpgmProtocol:
{
var listener = new PgmListener(ioThread, this, m_options);
try
{
listener.Init(address);
}
catch (NetMQException ex)
{
listener.Destroy();
EventBindFailed(addr, ex.ErrorCode);
throw;
}
m_options.LastEndpoint = addr;
AddEndpoint(addr, listener, null);
break;
}
case Address.IpcProtocol:
{
var listener = new IpcListener(ioThread, this, m_options);
try
{
listener.SetAddress(address);
m_port = listener.Port;
}
catch (NetMQException ex)
{
listener.Destroy();
EventBindFailed(addr, ex.ErrorCode);
throw;
}
m_options.LastEndpoint = listener.Address;
AddEndpoint(addr, listener,null);
break;
}
default:
{
throw new ArgumentException(string.Format("Address {0} has unsupported protocol: {1}", addr, protocol), "addr");
}
}
}