Помогите мне выбрать Socket или TCPListener - PullRequest
3 голосов
/ 23 февраля 2010

Я прочитал исходный код чата 2 C # и вижу проблему: Один источник использует класс Socket:

private void StartToListen(object sender , DoWorkEventArgs e)
{
    this.listenerSocket = new Socket(AddressFamily.InterNetwork , SocketType.Stream , ProtocolType.Tcp);
    this.listenerSocket.Bind(new IPEndPoint(this.serverIP , this.serverPort));
    this.listenerSocket.Listen(200);
    while ( true )
        this.CreateNewClientManager(this.listenerSocket.Accept());
}

А другой использует класс TcpListener:

    server = new TcpListener(portNumber);
    logger.Info("Server starts");
    while (true)
    {
        server.Start();
        if (server.Pending())
        {
            TcpClient connection = server.AcceptTcpClient();
            logger.Info("Connection made");
            BackForth BF = new BackForth(connection);
        }
    }

Пожалуйста, помогите мне выбрать один. Я должен использовать класс Socket или класс TcpListener. Сокетное соединение - это TCP или UDP? Спасибо.

1 Ответ

4 голосов
/ 23 февраля 2010

UDP не использует соединение, но может иметь поддельное соединение, примененное на обоих концах к объектам сокета. TCP является потоковым протоколом (то, что вы отправляете, будет получено в чанках на другом конце), и дополнительно создает сокеты конечной точки для каждого принятого соединения сокетов (основной сокет прослушивания остается нетронутым, хотя вам, вероятно, придется вызывать listen () снова). UDP использует дейтаграммы, порции данных, которые принимаются целиком на другой стороне (если только размер не превышает MTU, но это другая история).

Мне кажется, что эти два куска кода оба используют TCP, и поэтому базовый протокол одинаков, они должны быть полностью совместимы друг с другом. Выглядит так, как будто вы должны использовать второй бит кода, поскольку он более высокого уровня, но на самом деле это может использовать только сервер, клиенту нужен другой бит кода, так как он не слушает, он подключается ... Если вы можете найти «соединительный» код на том же уровне абстракции, используйте его.

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