Difference between TCP Listener and Socket

As far as I know I can create a server using both TCPListener and Socket, so what is the difference between the two of them?

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();

I'm really confused. The two of them listen for connections, so what is the difference between them?

Updated Code

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); } }
}

4 Answers

TcpListener is a convenient wrapper for TCP communications. This allows you to use TcpClient for accepted connections--although you can accept sockets instead of clients to use Socket instead of TcpClient. You can do the same thing with Socket; but you have to deal with some of the TCP-specifics (like SocketType.Stream, ProtocolType.Tcp). TCP is a stream-based protocol and TcpClient recognizes that by letting you do stream communications by providing a stream with TcpClient.GetStream(). Socket is at a higher different level and needs to support many different protocols like UDP that aren't stream based.

TcpClient.GetStream returns a NetworkStream object that is suitable for SslStream; so, it should be much less work than using Socket directly. The documentation for SslStream details using TcpListener and TcpClient for SSL communications.

7

They're just different classes that do the same thing, written at different levels. Under the hood the TCPListener undoubtedly calls something very like your first Socket-based code. It;s just there to hide you from some of the gory details.

0

A TcpListener wraps a socket, and is the server-side analog to the TcpClient (which also, of course, wraps a socket).

The TcpListener is preconfigured with TCP (as opposed to the Socket, which can be used with UDP, pure IP, non-IP protocols, etc.) and gives you a TcpClient when handling a connection.

If you're not sure if you need a Socket, and are using TCP - I'd strongly suggest starting with TcpListener/Client as it's a much easier to use interface.

6

I'm not really answering the question, but you seem to like TcpClient better because it has GetStream() which you can use with an SslStream, but you can get a NetworkStream out of a Socket by passing the Socket as a constructor to NetworkStream

i.e. NetworkStream myStream = new NetworkStream(mySocket);

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like