(0) exportieren Drucken
Alle erweitern

Socket-Klasse

Implementiert die Berkeley-Sockets-Schnittstelle.

Namespace: System.Net.Sockets
Assembly: System (in system.dll)

public class Socket : IDisposable
public class Socket implements IDisposable
public class Socket implements IDisposable

Die Socket-Klasse stellt eine große Anzahl von Methoden und Eigenschaften für die Netzwerkkommunikation bereit. Mit der Socket-Klasse können Sie sowohl synchrone als auch asynchrone Datenübertragungen mit einem der in der ProtocolType-Enumeration aufgelisteten Kommunikationsprotokolle ausführen. Die Socket-Klasse folgt dem .NET Framework-Benennungsmuster für asynchrone Methoden. Beispielsweise entspricht die synchrone Receive-Methode der asynchronen BeginReceive-Methode und der asynchronen EndReceive-Methode.

Wenn die Anwendung nicht mehr als einen Ausführungsthread benötigt, können Sie die folgenden Methoden verwenden, die für den synchronen Vorgangsmodus bereitstehen.

  • Wenn Sie ein verbindungsorientiertes Protokoll wie TCP verwenden, kann der Server mit der Listen-Methode Verbindungen überwachen. Die Accept-Methode verarbeitet eingehende Verbindungsanforderungen und gibt einen Socket zurück, den Sie verwenden können, um Daten mit dem Remotehost auszutauschen. Mit diesem zurückgegebenen Socket können Sie die Send-Methode oder die Receive-Methode aufrufen. Rufen Sie vor dem Aufruf der Listen-Methode die Bind-Methode auf, wenn Sie die lokale IP-Adresse und Anschlussnummer angeben möchten. Verwenden Sie die Anschlussnummer 0 (null), wenn der zugrunde liegende Dienstanbieter einen freien Anschluss für Sie zuweisen soll. Rufen Sie die Connect-Methode auf, wenn Sie eine Verbindung mit einem überwachenden Host herstellen möchten. Die Daten können durch Aufruf der Send-Methode oder der Receive-Methode übertragen werden.

  • Wenn Sie ein verbindungsloses Protokoll wie UDP verwenden, müssen Sie keine Verbindungen überwachen. Eingehende Datagramme können durch Aufruf der ReceiveFrom-Methode angenommen werden. Mit der SendTo-Methode können Sie Datagramme an einen Remotehost senden.

Verwenden Sie die folgenden Methoden, um die Kommunikation mit separaten Ausführungsthreads zu verarbeiten. Die folgenden Methoden wurden für den asynchronen Vorgangsmodus konzipiert.

  • Wenn Sie ein verbindungsorientiertes Protokoll wie TCP verwenden, können Sie mit der Socket-Methode, der BeginConnect-Methode und der EndConnect-Methode Verbindungen mit einem überwachenden Host herstellen. Die asynchrone Datenkommunikation kann mit der BeginSend-Methode und der EndSend-Methode bzw. der BeginReceive-Methode und der EndReceive-Methode stattfinden. Eingehende Verbindungsanforderungen können mit BeginAccept und EndAccept verarbeitet werden.

  • Wenn Sie ein verbindungsloses Protokoll wie UDP verwenden, können Sie mit BeginSendTo und EndSendTo Datagramme senden und mit BeginReceiveFrom und EndReceiveFrom Datagramme empfangen.

Wenn Sie mehrere asynchrone Vorgänge für ein Socket ausführen, werden diese nicht notwendigerweise in der Startreihenfolge abgeschlossen.

Nach dem Senden bzw. Empfangen von Daten deaktivieren Sie den Socket mit der Shutdown-Methode. Rufen Sie nach der Shutdown-Methode die Close-Methode auf, um alle dem Socket zugeordneten Ressourcen freizugeben.

Die Socket-Klasse ermöglicht das Konfigurieren des Socket mit der SetSocketOption-Methode. Rufen Sie die entsprechenden Einstellungen mit der GetSocketOption-Methode ab.

HinweisHinweis

Wenn Sie eine eher einfache Anwendung schreiben und nicht die maximale Leistung benötigen, bietet sich die Verwendung von TcpClient, TcpListener und UdpClient an. Diese Klassen stellen eine einfachere und benutzerfreundlichere Schnittstelle für die Socket-Kommunikation bereit.

Hinweis zu Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows CE: Nicht alle Socketoptionen werden auf allen Gerätebetriebssystemen unterstützt.

Im folgenden Codebeispiel wird veranschaulicht, wie mit der Socket-Klasse Daten an einen HTTP-Server gesendet werden können und die Antwort empfangen werden kann. In diesem Beispiel wird die Ausführung blockiert, bis die ganze Seite empfangen wurde.

using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

public class GetSocket
{
    private static Socket ConnectSocket(string server, int port)
    {
        Socket s = null;
        IPHostEntry hostEntry = null;
        
        // Get host related information.
        hostEntry = Dns.GetHostEntry(server);

        // Loop through the AddressList to obtain the supported AddressFamily. This is to avoid
        // an exception that occurs when the host IP Address is not compatible with the address family
        // (typical in the IPv6 case).
        foreach(IPAddress address in hostEntry.AddressList)
        {
            IPEndPoint ipe = new IPEndPoint(address, port);
            Socket tempSocket = 
                new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

            tempSocket.Connect(ipe);

            if(tempSocket.Connected)
            {
                s = tempSocket;
                break;
            }
            else
            {
                continue;
            }
        }
        return s;
    }

    // This method requests the home page content for the specified server.
    private static string SocketSendReceive(string server, int port) 
    {
        string request = "GET / HTTP/1.1\r\nHost: " + server + 
            "\r\nConnection: Close\r\n\r\n";
        Byte[] bytesSent = Encoding.ASCII.GetBytes(request);
        Byte[] bytesReceived = new Byte[256];
       
        // Create a socket connection with the specified server and port.
        Socket s = ConnectSocket(server, port);

        if (s == null)
            return ("Connection failed");
      
        // Send request to the server.
        s.Send(bytesSent, bytesSent.Length, 0);  
        
        // Receive the server home page content.
        int bytes = 0;
        string page = "Default HTML page on " + server + ":\r\n";

        // The following will block until te page is transmitted.
        do {
            bytes = s.Receive(bytesReceived, bytesReceived.Length, 0);
            page = page + Encoding.ASCII.GetString(bytesReceived, 0, bytes);
        }
        while (bytes > 0);
        
        return page;
    }
    
    public static void Main(string[] args) 
    {
        string host;
        int port = 80;

        if (args.Length == 0)
            // If no server name is passed as argument to this program, 
            // use the current host name as the default.
            host = Dns.GetHostName();
        else
            host = args[0];

        string result = SocketSendReceive(host, port); 
        Console.WriteLine(result);
    }
}


import System.*;
import System.Text.*;
import System.IO.*;
import System.Net.*;
import System.Net.Sockets.*;

public class GetSocket
{
    private static Socket ConnectSocket(String server, int port)
    {
        Socket s = null;
        IPHostEntry hostEntry = null;

        // Get host related information.
        hostEntry = Dns.Resolve(server);

        // Loop through the AddressList to obtain the supported AddressFamily. 
        // This is to avoid an exception that occurs when the host IP Address 
        // is not compatible with the address family
        // (typical in the IPv6 case).
        for (int iCtr = 0; iCtr < hostEntry.get_AddressList().length; iCtr++) {
            IPAddress address = hostEntry.get_AddressList()[iCtr];
            IPEndPoint ipe = new IPEndPoint(address, port);
            Socket tempSocket = new Socket(ipe.get_AddressFamily(),
                SocketType.Stream, ProtocolType.Tcp);
            tempSocket.Connect(ipe);
            if (tempSocket.get_Connected()) {
                s = tempSocket;
                break;
            }
            else {
                continue;
            }
        }

        return s;
    } //ConnectSocket

    // This method requests the home page content for the specified server.
    private static String SocketSendReceive(String server, int port)
    {
        String request = "GET / HTTP/1.1\r\nHost: " + server 
            + "\r\nConnection: Close\r\n\r\n";
        System.Byte bytesSent[] = 
            (System.Byte[])Encoding.get_ASCII().GetBytes(request);
        System.Byte bytesReceived[] = new System.Byte[256];

        // Create a socket connection with the specified server and port.
        Socket s = ConnectSocket(server, port);
        if (s == null) {
            return "Connection failed";
        }

        // Send request to the server.
        s.Send((ubyte[])bytesSent, bytesSent.length, (SocketFlags)0);

        // Receive the server home page content.
        int bytes = 0;
        String page = "Default HTML page on " + server + ":\r\n";

        // The following will block until te page is transmitted.
        do {
            bytes = s.Receive((ubyte[])bytesReceived,
                bytesReceived.length, (SocketFlags)0);
            page = page + Encoding.get_ASCII().GetString(
                (ubyte[])bytesReceived, 0, bytes);
        } while (bytes > 0);
        return page;
    } //SocketSendReceive

    public static void main(String[] args)
    {
        String host;
        int port = 80;
        if (args.length == 0) {
            // If no server name is passed as argument to this program, 
            // use the current host name as the default.
            host = Dns.GetHostName();
        }
        else {
            host = args[0];
        }
        String result = SocketSendReceive(host, port);
        Console.WriteLine(result);
    } //main
} //GetSocket

  • SocketPermission  zum Herstellen einer ausgehenden Verbindung oder Annehmen einer eingehenden Anforderung.

System.Object
  System.Net.Sockets.Socket

Instanzen dieser Klasse sind threadsicher.

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 2.0, 1.0
Anzeigen:
© 2014 Microsoft