Зачем мне два сокета в серверном приложении? - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь научиться программировать сокеты на C # С помощью Google я нашел много хороших уроков и примеров.Но вот мой собственный код:

Приложение отправителя:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net; // socket library
using System.Net.Sockets; // socket library

namespace Sender
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Enter remote IP : ");
            IPAddress ipAddress = IPAddress.Parse(Console.ReadLine());
            Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            sender.Connect(ipAddress, 4444);
            Console.Write("Enter text to send : ");
            byte[] message = Encoding.ASCII.GetBytes(Console.ReadLine().ToString());
            sender.Send(message);
            sender.Shutdown(SocketShutdown.Both);
            sender.Close();
            Console.ReadKey();           
        } // main
    } // main
} // main

Приложение получателя:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net; // socket library
using System.Net.Sockets; // socket library

namespace Listener
{
    class Program
    {
        static void Main(string[] args)
        {                        
            IPAddress ipAddress = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => address.AddressFamily == AddressFamily.InterNetwork).First();
            Console.WriteLine("Listening on " + ipAddress.ToString() + " : 4444");
            IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 4444);
            Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            listener.Bind(localEndPoint);
            listener.Listen(10);            
            Socket handler = listener.Accept();
            byte[] bytes = new Byte[1024];
            int bytesRec = handler.Receive(bytes);            
            Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, bytesRec));
            handler.Shutdown(SocketShutdown.Both);
            handler.Close();            
            listener.Close();
            Console.ReadKey();
        } // main
    } // main
} // main

код работает нормально, но я хочу знать, зачем мне два сокета на стороне сервера?Первый - слушатель, а второй - обработчик.Можно ли опустить один из них, чтобы код стал более простым?

Кстати, мой код основан на этих кодах:

Пример синхронного клиентского сокета: https://docs.microsoft.com/en-us/dotnet/framework/network-programming/synchronous-client-socket-example

Пример сокета синхронного сервера: https://docs.microsoft.com/en-us/dotnet/framework/network-programming/synchronous-server-socket-example

Также я использую Microsoft Visual C # 2008 Express Edition

1 Ответ

0 голосов
/ 12 февраля 2019

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

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


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

Более высокоуровневый API (TcpListener и TcpClient) проводит четкое разграничение между функциями прослушивания и общения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...