2013-09-24 22 views
0

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

的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:更新的代码。现在它工作。

回答

1

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

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

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

RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["reroutei4702"]. 
IPEndpoint.Port