sockets - TCP监听器和套接字之间的区别

标签 sockets tcp client serversocket tcplistener

据我所知,我可以同时使用 TCPListener 和 Socket 创建服务器,那么它们两者之间有什么区别?

套接字

private Socket MainSock;
MainSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
MainSock.Bind(new IPEndPoint(IPAddress.Any, port));
MainSock.Listen(500);
MainSock.BeginAccept(AcceptConnections, new Wrapper());

TCPListener

    Int32 port = 13000;
    IPAddress localAddr = IPAddress.Parse("127.0.0.1");
    TcpListener server = new TcpListener(localAddr, port);
    server.Start();

我真的很困惑。两者都是监听连接,那么它们有什么区别呢?

更新代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.IO;

public class Wrapper
{
    public byte[] buffer;
    public SslStream sslStream;
    public object connector;
}

public class Sock
{
    private Dictionary<string, byte> Connections;
    public event Action<Wrapper> AnnounceNewConnection;
    public event Action<Wrapper> AnnounceDisconnection;
    public event Action<byte[], Wrapper> AnnounceReceive;
    private Socket _sock;

    private X509Certificate certificate = X509Certificate.CreateFromCertFile("exportedcertificate.cer");

    public Sock(int port)
    {
        try
        {
            Connections = new Dictionary<string, byte>();
            _sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            _sock.Bind(new IPEndPoint(IPAddress.Any, port));
            _sock.Listen(500);
            _sock.BeginAccept(AcceptConnections, new Wrapper());
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

    private void AcceptConnections(IAsyncResult result)
    {
        Wrapper wr = (Wrapper)result.AsyncState;
        try
        {
            wr.sslStream = new SslStream(new NetworkStream(_sock.EndAccept(result), true));
            wr.sslStream.BeginAuthenticateAsServer(certificate, AcceptAuthenticate, wr);

            _sock.BeginAccept(AcceptConnections, new Wrapper());
        }
        catch (Exception e) { Console.WriteLine(e); }
    }

    private void AcceptAuthenticate(IAsyncResult result)
    {
        Wrapper wr = (Wrapper)result.AsyncState;
        try
        {
            wr.sslStream.EndAuthenticateAsServer(result);
            if (wr.sslStream.IsAuthenticated == true)
            {
                AnnounceNewConnection.Invoke(wr);
            }
        }
        catch (Exception e) { Console.WriteLine(e); }
    }

    private void ReceiveData(IAsyncResult result)
    {
        Wrapper wr = (Wrapper)result.AsyncState;
        try
        {
            AnnounceReceive.Invoke(wr.buffer, wr);
        }
        catch (Exception e) { Console.WriteLine(e); AnnounceDisconnection.Invoke(wr); }
    }
}

最佳答案

TcpListener 是一个方便的 TCP 通信包装器。这允许您使用 TcpClient 来接受连接——尽管您可以接受套接字而不是客户端来使用 Socket 而不是 TcpClient。您可以使用 Socket 做同样的事情;但是您必须处理一些 TCP 特定的问题(例如 SocketType.Stream、ProtocolType.Tcp)。 TCP 是一种基于流的协议(protocol),TcpClient 通过使用 TcpClient.GetStream() 提供流让您进行流通信来识别这一点。 Socket 处于更高 不同的级别,需要支持许多不同的协议(protocol),例如 UDP,这些协议(protocol)不是基于流的。

TcpClient.GetStream返回一个适合SslStreamNetworkStream对象;所以,它应该比直接使用 Socket 简单得多。 documentation for SslStream使用 TcpListenerTcpClient 进行 SSL 通信的详细信息。

关于sockets - TCP监听器和套接字之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12361924/

相关文章:

c - 客户端-服务器之类的应用程序中的线程同步?

java - 在 Java 中将位打包到长服务器/客户端事务中

php - PHP 中如何访问 session 变量?

使用 Rserve 重置 Java.net 连接

c - libevent 和非阻塞套接字

java - spring 集成超时客户端

python - PC 通过 TCP/IP 套接字连接到树莓派

Javascript客户端无法连接到java服务器

python - 套接字关闭和重新绑定(bind) - 如何避免长时间等待?

tcp - TCP/IP 是否防止数据包重播?