Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Merekabentuk Pelayan TCP/IP Boleh Skala dengan Sambungan Berpanjangan?

Bagaimana untuk Merekabentuk Pelayan TCP/IP Boleh Skala dengan Sambungan Berpanjangan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-29 05:06:09374semak imbas

How to Design a Scalable TCP/IP Server with Long-Running Connections?

Corak Reka Bentuk Pelayan TCP/IP Berskala

Apabila mereka bentuk pelayan TCP/IP berskala yang memerlukan sambungan jangka panjang, adalah penting untuk dipertimbangkan seni bina rangkaian yang paling cekap. Soket tak segerak ialah pendekatan yang disyorkan kerana keupayaannya untuk mengendalikan berbilang pelanggan secara serentak tanpa menggunakan sumber yang berlebihan.

Seni Bina Rangkaian

  • Pelayan :

    • Mulakan perkhidmatan dengan sekurang-kurangnya satu urutan untuk mengendalikan sambungan masuk.
    • Laksanakan soket tak segerak menggunakan kaedah BeginReceive dan EndReceive.
    • Buat kelas untuk mengurus sambungan klien, termasuk senarai untuk menyimpan rujukan kepada klien aktif.
    • Gunakan kaedah BeginAccept pada soket pelayan untuk mendengar sambungan masuk dan memanggil TerimaPanggil Balik apabila sambungan diwujudkan.
  • Pelanggan:

    • Sambung ke pelayan menggunakan soket.
    • Hantar dan terima data melalui soket secara tidak segerak menggunakan BeginSend dan BeginReceive.

Aliran Data

  • Data terutamanya mengalir dari pelayan kepada pelanggan, dengan arahan sekali-sekala daripada pelanggan .
  • Pelayan menghantar data status secara berkala ke pelanggan.
  • Data yang diterima daripada pelanggan boleh ditimbal dan diproses secara tidak segerak, mewujudkan kerja pada kumpulan benang untuk mengelakkan kelewatan dalam penerimaan data selanjutnya.

Kod Contoh

using System;
using System.Net;
using System.Net.Sockets;

namespace TcpServer
{
    class xConnection
    {
        public byte[] buffer;
        public System.Net.Sockets.Socket socket;
    }

    class Server
    {
        private List<xConnection> _sockets;
        private System.Net.Sockets.Socket _serverSocket;
        private int _port;
        private int _backlog;

        public bool Start()
        {
            IPHostEntry localhost = Dns.GetHostEntry(Dns.GetHostName());
            IPEndPoint serverEndPoint = new IPEndPoint(localhost.AddressList[0], _port);

            try
            {
                _serverSocket = new Socket(serverEndPoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                _serverSocket.Bind(serverEndPoint);
                _serverSocket.Listen(_backlog);
                _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket);
                return true;
            }
            catch (Exception e)
            {
                // Handle exceptions appropriately
                return false;
            }
        }

        private void AcceptCallback(IAsyncResult result)
        {
            try
            {
                Socket serverSocket = (Socket)result.AsyncState;
                xConnection conn = new xConnection();
                conn.socket = serverSocket.EndAccept(result);
                conn.buffer = new byte[_bufferSize];

                lock (_sockets)
                {
                    _sockets.Add(conn);
                }
                conn.socket.BeginReceive(conn.buffer, 0, conn.buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), conn);
                _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket);
            }
            catch (Exception e)
            {
                // Handle exceptions appropriately
            }
        }

        private void Send(byte[] message, xConnection conn)
        {
            if (conn != null &amp;&amp; conn.socket.Connected)
            {
                lock (conn.socket)
                {
                    conn.socket.Send(message, message.Length, SocketFlags.None);
                }
            }
        }
    }
}

Tambahan Pertimbangan

  • Pertimbangkan untuk menggunakan protokol pemasangan semula untuk mengendalikan serpihan data yang masuk.
  • Gunakan satu BeginAccept pada satu-satu masa untuk mengelakkan kemungkinan pepijat.
  • Segerakkan akses kepada sumber yang dikongsi, seperti senarai pelanggan, untuk memastikan keselamatan rangkaian.

Atas ialah kandungan terperinci Bagaimana untuk Merekabentuk Pelayan TCP/IP Boleh Skala dengan Sambungan Berpanjangan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn