通信


クライアントソケットクラス実装例を示します。

		
/// <summary>非同期クライアントソケットクラス</summary>
public class SocketClient
{
  // 通信ソケット
  private Socket _connectedSocket;

  /// <summary>接続実行</summary>
  /// <param name="szAddress">リモートIPアドレス</param>
  /// <param name="nPortNo">ポート番号</param>
  public void Connect( string szAddress, int nPortNo )
  {
    _connectedSocket = new Socket(
      AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );

    // 接続開始
    _connectedSocket.BeginConnect( szAddress, nPortNo,
      new AsyncCallback( EstablishedConnectionCallBack ), _connectedSocket );

  }

  /// <summary>通信確立コールバック</summary>
  /// <param name="ar">ソケットオブジェクト</param>
  private void EstablishedConnectionCallBack( IAsyncResult ar )
  {
    Socket connectedSocket = ( Socket )ar.AsyncState;
    bool bRet = connectedSocket.Poll( 1, SelectMode.SelectWrite );
    if( bRet == false )
    {
      // 接続失敗
      _connectedSocket = null;
      return;
    }

    // 通信確立処理完了
    connectedSocket.EndConnect( ar );

    SocketStateObject stateObject = new SocketStateObject();
    stateObject.ConnectedSocket = connectedSocket;

    // 受信開始
    IAsyncResult _iAsyncResult = stateObject.ConnectedSocket.BeginReceive( stateObject.Data, 0
      , stateObject.Data.Length, SocketFlags.None
      , new AsyncCallback( this.ReceiveCallback ), stateObject );
  }
  /// <summary>受信完了コールバック</summary>
  /// <param name="ar">ソケットオブジェクト</param>
  private void ReceiveCallback( IAsyncResult ar )
  {
    SocketStateObject stateObject = ( SocketStateObject )ar.AsyncState;

    // 受信完了
    int nReceivedLength = stateObject.ConnectedSocket.EndReceive( ar );

    // 受信データ
    byte[] receivedData = new byte[ nReceivedLength ];
    Array.Copy( stateObject.Data, receivedData, nReceivedLength );

    // 次受信開始
    stateObject.ConnectedSocket.BeginReceive( stateObject.Data, 0
      , stateObject.Data.Length, SocketFlags.None
      , new AsyncCallback( this.ReceiveCallback ), stateObject );
  }
  /// <summary>バイナリメッセージ送信開始</summary>
  /// <param name="btData">バイナリメッセージ</param>
  public void Send( byte[] btData )
  {
    if( _connectedSocket.Connected == false ) return;

    // 送信開始
    _connectedSocket.BeginSend( btData, 0, btData.Length, SocketFlags.None,
      new AsyncCallback( SendCallback ), _connectedSocket );

  }
  /// <summary>送信完了コールバック</summary>
  /// <param name="ar">ソケットオブジェクト</param>
  private void SendCallback( IAsyncResult ar )
  {
    Socket sockClient = ( Socket )ar.AsyncState;

    // 送信完了
    int nByteSent = sockClient.EndSend( ar );
  }

}

		
	


inserted by FC2 system