Который PID слушает на данном порте в c#

Основной выбор:

  • Масштабирование по вертикали с использованием большого компьютера. Тем не менее, вы в конечном итоге достигнете предела, и у вас будет единственная точка отказа (один сервер!), или
  • Масштабировать по горизонтали , добавляя больше серверов и Распределение трафика по серверам. Это дает дополнительное преимущество обработки ошибок, потому что, если один сервер выходит из строя, другие могут продолжать обслуживать трафик.

Преимуществом горизонтального масштабирования в облаке является возможность добавлять / удалять серверы на основе рабочей нагрузки . Когда все занято, добавьте больше серверов. Когда все тихо, удалите серверы. Это также позволяет снизить затраты, когда все тихо (что невозможно на месте, если у вас есть собственное оборудование).

Архитектура предполагает размещение нескольких серверов за балансировщиком нагрузки:

Load Balancing

  • Трафик поступает в Балансировщик нагрузки
  • Балансировщик нагрузки отправляет запрос на сервер (часто исходя из некоторой степени «загруженности» каждого сервера).
  • Сервер обрабатывает запрос, и отправляет ответ обратно на балансировщик нагрузки
  • балансировщик нагрузки отправляет ответ исходному запрашивающему

AWS имеет несколько доступных балансировщиков нагрузки, которые варьируются в зависимости от необходимость. Если вы просто отправляете трафик одному приложению, установленному на всех серверах, то Network Load Balancer должно быть достаточно. В ситуациях, когда разные части приложения находятся на разных серверах (например, мобильный интерфейс или веб-интерфейс), вы можете использовать Балансировщик нагрузки приложения .

AWS также помогает с горизонтальным масштабированием, предоставляя сервис Amazon EC2 Auto Scaling . Это позволяет вам указать подробную информацию о серверах для запуска (образ диска, тип экземпляра, сетевые настройки), а затем автоматическое масштабирование может автоматически запускать новых серверов при необходимости и завершать тех, которые не ' т требуется. (Обратите внимание, что они запускаются и завершаются, а не запускаются и останавливаются.)

Вы можете дополнительно определить политики масштабирования , которые сообщают автоматическому масштабированию , когда запускать / завершать экземпляры, измеряя метрики, такие как загрузка процессора. Таким образом, количество серверов может приблизительно соответствовать объему трафика.

Следует отметить, что если у вас есть база данных , она должна храниться отдельно на серверах приложений, чтобы она не была завершена. Вы можете использовать Amazon Relational Database Service (RDS) для запуска базы данных для вас, или вы можете запустить ее на отдельном экземпляре Amazon EC2.

Если вы хотите узнать больше о любой из вышеперечисленных технологий, на YouTube или в блоге есть множество выступлений, которые могут объяснить и продемонстрировать их использование.

5
задан Philip Derbeko 23 February 2009 в 12:05
поделиться

2 ответа

от XP SP2 победы вперед Вы можете P/Invoke к GetExtendedTcpTable

Используя добрую работу Этого человека для изложения в деталях подписи (спецификация PInvoke.net является неполной) вот (груб и плох при проверке ошибок) пример

using System;
using System.Runtime.InteropServices;

public enum TCP_TABLE_CLASS : int
{
    TCP_TABLE_BASIC_LISTENER,
    TCP_TABLE_BASIC_CONNECTIONS,
    TCP_TABLE_BASIC_ALL,
    TCP_TABLE_OWNER_PID_LISTENER,
    TCP_TABLE_OWNER_PID_CONNECTIONS,
    TCP_TABLE_OWNER_PID_ALL,
    TCP_TABLE_OWNER_MODULE_LISTENER,
    TCP_TABLE_OWNER_MODULE_CONNECTIONS,
    TCP_TABLE_OWNER_MODULE_ALL
} 

[StructLayout(LayoutKind.Sequential)]
public struct MIB_TCPROW_OWNER_PID
{
    public uint state;
    public uint localAddr;
    public byte localPort1;
    public byte localPort2;
    public byte localPort3;
    public byte localPort4;
    public uint remoteAddr;
    public byte remotePort1;
    public byte remotePort2;
    public byte remotePort3;
    public byte remotePort4;
    public int owningPid;

    public ushort LocalPort
{
        get
        {
            return BitConverter.ToUInt16(
                new byte[2] { localPort2, localPort1}, 0);
        }
    }

    public ushort RemotePort
    {
        get
        {
            return BitConverter.ToUInt16(
                new byte[2] { remotePort2, remotePort1}, 0);
        }
    }
}

[StructLayout(LayoutKind.Sequential)]
public struct MIB_TCPTABLE_OWNER_PID
{
    public uint dwNumEntries;
    MIB_TCPROW_OWNER_PID table;
}

[DllImport("iphlpapi.dll", SetLastError=true)]
static extern uint GetExtendedTcpTable(IntPtr pTcpTable, 
    ref int dwOutBufLen, 
    bool sort, 
    int ipVersion, 
    TCP_TABLE_CLASS tblClass,
    int reserved);

public static MIB_TCPROW_OWNER_PID[] GetAllTcpConnections()
{
    MIB_TCPROW_OWNER_PID[] tTable;
    int AF_INET = 2;    // IP_v4
    int buffSize = 0;

    // how much memory do we need?
    uint ret = GetExtendedTcpTable(IntPtr.Zero, 
        ref buffSize, 
        true, 
        AF_INET, 
        TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL,
        0);        
    if (ret != 0 && ret != 122) // 122 insufficient buffer size
        throw new Exception("bad ret on check " + ret);
    IntPtr buffTable = Marshal.AllocHGlobal(buffSize);

    try
    {
        ret = GetExtendedTcpTable(buffTable, 
            ref buffSize, 
            true, 
            AF_INET, 
            TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL, 
            0);
        if (ret != 0)
            throw new Exception("bad ret "+ ret);        

        // get the number of entries in the table
        MIB_TCPTABLE_OWNER_PID tab = 
            (MIB_TCPTABLE_OWNER_PID)Marshal.PtrToStructure(
                buffTable, 
                typeof(MIB_TCPTABLE_OWNER_PID));
         IntPtr rowPtr = (IntPtr)((long)buffTable + 
             Marshal.SizeOf(tab.dwNumEntries));
        tTable = new MIB_TCPROW_OWNER_PID[tab.dwNumEntries];

        for (int i = 0; i < tab.dwNumEntries; i++)
        {
            MIB_TCPROW_OWNER_PID tcpRow = (MIB_TCPROW_OWNER_PID)Marshal
                .PtrToStructure(rowPtr, typeof(MIB_TCPROW_OWNER_PID));
            tTable[i] = tcpRow;
            // next entry
            rowPtr = (IntPtr)((long)rowPtr + Marshal.SizeOf(tcpRow));   
        }
    }
    finally
    {
        // Free the Memory
        Marshal.FreeHGlobal(buffTable);
    }
    return tTable;
}
7
ответ дан 13 December 2019 в 22:17
поделиться

проверьте этот проект: http://www.codeproject.com/KB/IP/iphlpapi.aspx

Это использует Interop в C# для получения до базовой API-функции Победы GetTcpTable. И поэтому может дать Вам идентификатор процесса, который Вы ищете.

надежда, которая помогает, Alex

3
ответ дан 13 December 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: