次の方法で共有


Socket クラス

Berkeley ソケット インターフェイスを実装します。

この型のすべてのメンバの一覧については、Socket メンバ を参照してください。

System.Object
   System.Net.Sockets.Socket

Public Class Socket
   Implements IDisposable
[C#]
public class Socket : IDisposable
[C++]
public __gc class Socket : public IDisposable
[JScript]
public class Socket implements IDisposable

スレッドセーフ

この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。

解説

Socket クラスには、ネットワーク通信のためのメソッドとプロパティが豊富に用意されています。 Socket クラスを使用すると、 ProtocolType 列挙体で示されている各種の通信プロトコルを使い、同期または非同期でデータを転送できます。 Socket クラスは、.NET Framework での非同期メソッドの名前付け規則に従っています。たとえば、同期の Receive メソッドは非同期の BeginReceive メソッドと EndReceive メソッドに対応します。

実行中に 1 つのスレッドしか必要ない場合に使用するメソッドを次に示します。これらのメソッドは同期操作モードでの使用を想定しています。

  • TCP などのコネクション指向のプロトコルを使用する場合、サーバーは Listen メソッドを使用して接続を待機します。 Accept メソッドは受信接続要求を処理して、リモート ホストとのデータ通信に使用できる Socket を返します。この返された Socket を使用して、 Send メソッドまたは Receive メソッドを呼び出します。ローカル IP アドレスとポート番号を指定する場合は、 Listen メソッドの前に Bind メソッドを呼び出します。 Bind を呼び出さない場合、これらの値は基になるサービス プロバイダによって割り当てられます。 LocalEndPoint プロパティを使用すると、 Socket に割り当てられている IP アドレスとポート番号を後で確認できます。待機中のホストに接続する必要がある場合は、 Connect メソッドを呼び出します。データを送受信するには、 Send メソッドまたは Receive メソッドを呼び出します。
  • UDP などのコネクションレスのプロトコルを使用している場合は、接続を待機する必要はありません。 ReceiveFrom メソッドを呼び出して、受信データグラムを受け取ります。データグラムをリモート ホストに送信するには、 SendTo メソッドを使用します。

実行中に個別のスレッドを使用して通信を処理する場合に使用するメソッドを次に示します。これらのメソッドは非同期操作モードでの使用を想定しています。

  • TCP などのコネクション指向のプロトコルを使用する場合は、 Socket メソッド、 BeginConnect メソッド、および EndConnect メソッドを使用して待機中のホストと通信します。データの非同期的な送受信には、 BeginSend メソッドと EndSend メソッドまたは BeginReceive メソッドと EndReceive メソッドを使用します。 BeginAccept および EndAccept を使用すると、受信接続要求を処理できます。
  • UDP などのコネクションレスのプロトコルを使用している場合は、 BeginSendTo および EndSendTo を使用してデータグラムを送信します。データグラムの受信には、 BeginReceiveFromEndReceiveFrom を使用します。

ソケット上で複数の非同期動作を実行する場合、各動作の実行は開始された順に完了するとは限りません。

データの送受信が完了したら、 Shutdown メソッドを使用して Socket を無効にします。 Shutdown を呼び出してから Close メソッドを呼び出して、 Socket に関連付けられているすべてのリソースを解放します。

Socket クラスを使用すると、 SetSocketOption メソッドを使用して Socket を設定できます。これらの設定を取得するには、 GetSocketOption メソッドを使用します。

メモ   比較的単純なアプリケーションを記述しており、同期的なデータ転送だけが必要な場合は、 TcpClientTcpListener 、および UdpClient を使用することを検討してください。これらのクラスには、 Socket 通信を行うためのより単純でわかりやすいインターフェイスが用意されています。

使用例

[Visual Basic, C#, C++] Socket クラスを使用して、データを HTTP サーバーに送信し応答を受信する方法を次の例に示します。

 
Imports System
Imports System.Text
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports Microsoft.VisualBasic

Public Class GetSocket
   
   Private Shared Function ConnectSocket(server As String, port As Integer) As Socket
      Dim s As Socket = Nothing
      Dim hostEntry As IPHostEntry = Nothing      
     
         ' 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 host IP Address is not compatible with the address family
         ' (typical in the IPv6 case).
      Dim address As IPAddress
 
        For Each address In  hostEntry.AddressList
            Dim endPoint As New IPEndPoint(address, port)
            Dim tempSocket As New Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp)
      
            tempSocket.Connect(endPoint)
            
            If tempSocket.Connected Then
               s = tempSocket
               Exit For
            End If

         Next address
      
      Return s
   End Function 
   
   
   ' This method requests the home page content for the specified server.
   
   Private Shared Function SocketSendReceive(server As String, port As Integer) As String
      'Set up variables and String to write to the server.
      Dim ascii As Encoding = Encoding.ASCII
      Dim request As String = "GET / HTTP/1.1" + ControlChars.Cr + ControlChars.Lf + "Host: " + server + ControlChars.Cr + ControlChars.Lf + "Connection: Close" + ControlChars.Cr + ControlChars.Lf + ControlChars.Cr + ControlChars.Lf
      Dim bytesSent As [Byte]() = ascii.GetBytes(request)
      Dim bytesReceived(255) As [Byte]
      
      ' Create a socket connection with the specified server and port.
      Dim s As Socket = ConnectSocket(server, port)
      
      If s Is Nothing Then
         Return "Connection failed"
      End If 
      ' Send request to the server.
      s.Send(bytesSent, bytesSent.Length, 0)
      
      ' Receive the server  home page content.
      Dim bytes As Int32
      
      ' Read the first 256 bytes.
      Dim page as [String] = "Default HTML page on " + server + ":" + ControlChars.Cr + ControlChars.Lf
      
      ' The following will block until the page is transmitted.
      Do
         bytes = s.Receive(bytesReceived, bytesReceived.Length, 0)
         page = page + ascii.ASCII.GetString(bytesReceived, 0, bytes)
      Loop While bytes > 0
      
      Return page
   End Function 
   
   'Entry point which delegates to C-style main Private Function
   Public Overloads Shared Sub Main()
      Main(System.Environment.GetCommandLineArgs())
   End Sub
   
   
   Overloads Private Shared Sub Main(args() As String)
      Dim host As String
      Dim port As Integer = 80
      
      If args.Length = 1 Then
         ' If no server name is passed as argument to this program, 
         ' use the current host name as default.
         host = Dns.GetHostName()
      Else
         host = args(1)
      End If 
      
      Dim result As String = SocketSendReceive(host, port)
      
      Console.WriteLine(result)
   End Sub 'Main
End Class  


[C#] 
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.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).
        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);
    }
}


[C++] 
#using <mscorlib.dll>
#using <System.dll>
using namespace System;
using namespace System::Text;
using namespace System::IO;
using namespace System::Net;
using namespace System::Net::Sockets;
using namespace System::Collections;

Socket * ConnectSocket(String* server, int port) {
    Socket* s = 0;
    IPHostEntry* hostEntry = 0;

    // 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).
    IEnumerator* myEnum = hostEntry->AddressList->GetEnumerator();
    while (myEnum->MoveNext()) 
    {
        IPAddress* address = __try_cast<IPAddress*>(myEnum->Current);
        IPEndPoint* endPoint = new IPEndPoint(address, port);
        Socket* tmpS = new Socket(endPoint->AddressFamily, SocketType::Stream, ProtocolType::Tcp);
        tmpS->Connect(endPoint);
        if (tmpS->Connected) 
        {
            s = tmpS;
            break;
        } else
        {
            continue;
        }
    }

    return s;
}

// This method requests the home page content for the specified server.

String* SocketSendReceive(String* server, int port) 
{
    String* request = String::Concat(S"GET / HTTP/1.1\r\nHost: ", server,
        S"\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 == 0)
        return (S"Connection failed");

    // Send request to the server.
    s->Send(bytesSent, bytesSent->Length, static_cast<SocketFlags>(0));

    // Receive the server home page content.
    int bytes = 0;
    String* strRetPage = String::Concat(S"Default HTML page on ", server, S":\r\n");
    
    do {
        bytes = s->Receive(bytesReceived, bytesReceived->Length, static_cast<SocketFlags>(0));
        strRetPage = String::Concat(strRetPage, Encoding::ASCII->GetString(bytesReceived, 0, bytes));
    }
    while (bytes > 0);
       
    return strRetPage;
}

int main() {
    String* args[] = Environment::GetCommandLineArgs();
    String* host;
    int port = 80;

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

    String* result = SocketSendReceive(host, port);
    Console::WriteLine(result);
}

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Net.Sockets

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET

アセンブリ: System (System.dll 内)

.NET Framework セキュリティ:

  • SocketPermission (送信接続を確立するか、受信要求を受け入れるためのアクセス許可)

参照

Socket メンバ | System.Net.Sockets 名前空間