【问题标题】:Azure worker role socket listener on 2 instances2 个实例上的 Azure 辅助角色套接字侦听器
【发布时间】:2013-09-29 16:59:04
【问题描述】:

我正在使用 azure 模拟器。我想在我的工作角色中监听端口 4702。当我有实例计数 = 1 时,它不会引发异常。但是如果将实例计数设置为 2,那么它会尝试在端口 4702 上打开两次(运行被触发两次)并引发异常:“每个套接字地址(协议/网络地址/端口)通常只允许一次使用” 如何正确监听 azure worker 角色的传入连接?

InputEndpoint 的类型是“输入” 配置:

  <WorkerRole name="GpsRerouterWorker" vmsize="Small">
    <Imports>
      <Import moduleName="Diagnostics" />
    </Imports>
    <Endpoints>
      <InputEndpoint name="reroutei4702" protocol="tcp" port="4702" localPort="4702" />
    </Endpoints>
    <LocalResources>
      <LocalStorage name="DiagnosticStore" sizeInMB="20000" cleanOnRoleRecycle="false" />
    </LocalResources>
  </WorkerRole>

代码:

    public class WorkerRole : RoleEntryPoint
    {
        public override void Run()
            {
System.Net.IPEndPoint IPEndpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["gpsreroutei4702"].IPEndpoint;                TcpListener listener = new TcpListener(IPEndpoint);
                listener.Start();

            Logger.Log("Server is running");

            while (true)
            {
                Logger.Log("Waiting for connections...");
                try
                {
                    var tcpClient = await listener.AcceptTcpClientAsync();
                    await HandleConnectionAsync(tcpClient);
                }
                catch (Exception exp)
                {
                    Logger.Log(exp.ToString());
                }

            }
        }

        public override bool OnStart()
        {
            // Set the maximum number of concurrent connections 
            ServicePointManager.DefaultConnectionLimit = 12;

            // For information on handling configuration changes
            // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.

            return base.OnStart();
        }
    }

UPD:更新了代码。现在可以了。

【问题讨论】:

    标签: sockets azure endpoint azure-worker-roles


    【解决方案1】:

    我认为您的问题可能与IPAddress.Any 行有关。如果您在模拟器中启动同一角色的多个实例,则每个实例都应该获得自己的 IPAddress。

    以下属性应该为您提供每个实例的 IP 和端口。

    RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["reroutei4702"].
    IPEndpoint.Address.ToString();
    
    RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["reroutei4702"].
    IPEndpoint.Port
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 2015-07-31
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多