通信
- クライアントソケット
クライアントソケットクラス実装例を示します。
/// <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 );
}
}