次の方法で共有


Socket.Send メソッド (Byte , Int32, Int32, SocketFlags)

指定した SocketFlags を使用し、指定したバイト数のデータを、接続された Socket に送信します。送信は指定したオフセットから開始されます。

Overloads Public Function Send( _
   ByVal buffer() As Byte, _   ByVal offset As Integer, _   ByVal size As Integer, _   ByVal socketFlags As SocketFlags _) As Integer
[C#]
public int Send(byte[] buffer,intoffset,intsize,SocketFlagssocketFlags);
[C++]
public: int Send(unsigned charbuffer __gc[],intoffset,intsize,SocketFlagssocketFlags);
[JScript]
public function Send(
   buffer : Byte[],offset : int,size : int,socketFlags : SocketFlags) : int;

パラメータ

  • buffer
    送信するデータを格納する Byte 型の配列。
  • offset
    データの送信を開始する、データ バッファ内の位置。
  • size
    送信するバイト数。
  • socketFlags
    SocketFlags 値のビットごとの組み合わせ。

戻り値

Socket に送信されたバイト数。

例外

例外の種類 条件
ArgumentNullException buffer が null 参照 (Visual Basic では Nothing) です。
ArgumentOutOfRangeException offset が 0 未満です。

または

offsetbuffer の長さを超えています。

または

size が 0 未満です。

または

size が、 buffer の長さから offset パラメータの値を引いた値を超えています。

SocketException socketFlags が、値の有効な組み合わせではありません。

または

Socket にアクセス中にオペレーティング システム エラーが発生しました。詳細については「解説」を参照してください。

ObjectDisposedException Socket は閉じられています。

解説

Send は、 Connect メソッドまたは Accept メソッドで指定されたリモート ホストに同期的にデータを送信し、正常に送信されたバイト数を返します。 Send はコネクション指向のプロトコルとコネクションレスのプロトコルの両方で使用できます。

このオーバーロードで、 DontRoute フラグを socketflags パラメータとして指定した場合、送信しようとしているデータはルーティングされません。 OutOfBand フラグを socketflags パラメータとして指定した場合、 Send は帯域外データだけを送信します。OOB データは、接続しているストリーム ソケットの各ペアに関連付けられる、論理的に独立した伝送チャネルです。このデータは、高い優先順位で、通常のデータとは独立して送信されます。

コネクションレスのプロトコルを使用している場合は、このメソッドを呼び出す前に Connect を呼び出す必要があります。これをしないと、 SendSocketException をスローします。コネクション指向のプロトコルを使用する場合は、 Connect を使用してリモート ホストとの接続を確立するか、 Accept を使用して受信接続を受け入れる必要があります。

コネクションレスのプロトコルを使用していて、複数の異なるホストにデータを送信する予定がある場合は、 SendTo を使用してください。 SendTo を使用しない場合は、 Send への各呼び出しの前に Connect を呼び出す必要があります。 SendTo は、 Connect で既定のリモート ホストを確立した後でも使用できます。また、 Send の呼び出しの前に、 Connect を呼び出すことによって、既定のリモート ホストを変更できます。

また、サイズが、基になるサービス プロバイダの最大パケット サイズを超えないことを確認する必要もあります。その場合、データグラムは送信されず、 SendSocketException をスローします。

コネクション指向のプロトコルを使用している場合、 Send は、要求されたバイト数が送信されるまでブロックします。非ブロッキングモードでは、要求したバイト数より Send が送信したバイト数の方が小さくても、このメソッドは正常に完了します。送信されたバイト数を監視し、要求されたバイト数をすべて送信するまで操作を再試行することは、アプリケーション側の責任です。また、送信したデータがすぐにネットワーク上に現れることは保証されません。ネットワークの効率を高めるため、基になっているシステムは、十分な量の送信データが収集されるまで送信を遅延することがあります。 Send メソッドが正常に完了した場合は、基になるシステムにネットワーク送信のためにデータをバッファする余地があったことを示します。すべてのバイトをリモート ホストにすぐに送信することがアプリケーションの重要な要件の場合は、 SetSocketOption を使用して SocketOptionName.NoDelay を有効にすることができます。ネットワーク効率を高めるためのバッファの詳細については、MSDN の Nagle アルゴリズムを参照してください。

メモ    SocketException が発生した場合は、 SocketException.ErrorCode を使用して具体的なエラー コードを取得してください。このコードを取得したら、Windows Socket Version 2 API エラー コードのマニュアルから、エラーの詳細情報を確認できます。これは MSDN から入手できます。

.NET Compact Framework - Windows CE .NET プラットフォームに関する注意点: このメソッドで長さ 0 のデータを送信した場合の結果は、.NET Compact Framework ではなく、ネイティブ オペレーティング システムによって決まります。

使用例

[Visual Basic, C#, C++] データ バッファ、オフセット、サイズ、および接続された Socket にデータを送信する SocketFlags を指定する例を次に示します。

 
' Displays sending with a connected socket
' using the overload that takes a buffer, offset, message size, and socket flags.
Public Shared Function SendReceiveTest4(server As Socket) As Integer
    Dim msg As Byte() = Encoding.UTF8.GetBytes("This is a test")
    Dim bytes(255) As Byte
    Try
        ' Blocks until send returns.
        Dim i As Integer = server.Send(msg, 0, msg.Length, SocketFlags.None)
        Console.WriteLine("Sent {0} bytes.", i)
        
        ' Get reply from the server.
        server.Receive(bytes, 0, server.Available, SocketFlags.None)
        Console.WriteLine(Encoding.UTF8.GetString(bytes))
    Catch e As SocketException
        Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode)
        Return e.ErrorCode
    End Try
    Return 0
End Function 'SendReceiveTest4


[C#] 
// Displays sending with a connected socket
// using the overload that takes a buffer, offset, message size, and socket flags.
public static int SendReceiveTest4(Socket server)
{
    byte[] msg = Encoding.UTF8.GetBytes("This is a test");
    byte[] bytes = new byte[256];
    try 
    {
        // Blocks until send returns.
        int i = server.Send(msg, 0, msg.Length, SocketFlags.None);
        Console.WriteLine("Sent {0} bytes.", i);
        
        // Get reply from the server.
        server.Receive(bytes, 0, server.Available, SocketFlags.None);
        Console.WriteLine(Encoding.UTF8.GetString(bytes));
    }
    catch (SocketException e)
    {
        Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
        return (e.ErrorCode);
    }
    return 0;
}

[C++] 
// Displays sending with a connected socket
// using the overload that takes a buffer, offset, message size, and socket flags.
int SendReceiveTest4(Socket* server)
{
    Byte msg[]= Encoding::UTF8->GetBytes(S"This is a test");
    Byte bytes[] = new Byte[256];
    try 
    {
        // Blocks until send returns.
        int i = server->Send(msg, 0, msg.Length, SocketFlags::None);
        Console::WriteLine(S"Sent {0} bytes.", i.ToString());
        
        // Get reply from the server.
        server->Receive(bytes, 0, server->Available, SocketFlags::None);
        Console::WriteLine(Encoding::UTF8->GetString(bytes));
    }
    catch (SocketException* e)
    {
        Console::WriteLine("{0} Error code: {1}.", e->Message, e->ErrorCode.ToString());
        return ( e->ErrorCode);
    }
    return 0;
}

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

必要条件

プラットフォーム: 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, Common Language Infrastructure (CLI) Standard

参照

Socket クラス | Socket メンバ | System.Net.Sockets 名前空間 | Socket.Send オーバーロードの一覧 | Connect | SendTo | SocketFlags | SetSocketOption