2013-09-24 3 views
0

Я использую лазурный эмулятор. Я хочу слушать порт 4702 в моей рабочей роли. Когда у меня есть экземпляры count = 1, он не генерирует исключение. Но если установить экземпляры count в 2, то он пытается открыть на порт 4702 два раза (запуск запускается два раза) и генерируется исключение: «Обычно разрешено только одно использование каждого адреса сокета (протокола/сетевого адреса/порта) Как правильно прослушивать входящие соединения в рабочей роли azure?Слушатель ролики розницы Azure на двух экземплярах

тип InputEndpoint является "Input" Конфигурация:

<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 
Смежные вопросы