Visual C++5.0以降用 TCP/IP通信モジュール  version 0.02

概要:このモジュールは、MSWINSCK.OCX が無くてもTCP/IP通信ができるように
 することを目的に作成されました。OCXは便利ですが、レジストリに登録されて
 いなかったりバージョンが古かったりすると役に立たないので、ソースプログラムに
 直接追加できるようにOCX化は行なっていません。
 Win32 Application での使用を前提としています。
 (Win32 Console Application でも工夫すれば使えるかも?)
 なお、プロトコルはTCPのみです。UDPには対応していません。

操作方法:まず、TCPSock.cpp をプロジェクトに追加してください。次に、「プロジェ
 クト」→「設定」の中から、「リンク」タブを選び、「オブジェクト/ライブラリモ
 ジュール」の中に、wsock32.lib を追加してください。その後、ソケットを使用する
 ファイルに対して、TCPSock.h をインクルードしてください。

関数リスト:以下の関数をサポートしています。

 グローバル関数
   BOOL StartupSocket(void);
   char *GetErrorMsg(DWORD ErrNo);
   DWORD GetHostByNameAlias(const char *strHostName);
   char *GetHostNameByAddr(DWORD lngHostIP);

 メンバ関数
  メソッド
   void Initialize(void (*EventError)(DWORD ErrorCode) = NULL,
      void (*EventClose)(void) = NULL,
      void (*EventConnectionRequest)(SOCKET requestID) = NULL,
      void (*EventConnect)(void) = NULL,
      void (*EventDataArrival)(DWORD bytesTotal) = NULL);
   void Terminate(void);
   DWORD GetLastError(void);
   BOOL Accept(DWORD requestID);
   BOOL Bind(WORD LocalPort);
   void Close(void);
   BOOL Connect(void);
   BOOL GetData(char *Buffer, DWORD ReadByte);
   BOOL Listen(void);
   BOOL SendData(char *Buffer, DWORD WriteByte);
   void ResetSendStatistics(void);
   void ResetReceiveStatistics(void);
   DWORD GetSendStatistics(void);
   DWORD GetReceiveStatistics(void);
  プロパティ
   char *GetLocalHost(void);
   char *GetLocalHostIP(void);
   WORD GetLocalPort(void);
   BOOL SetLocalPort(WORD LocalPort);
   BOOL SetRemoteHost(char *RemoteHost);
   char *GetRemoteHost(void);
   char *GetRemoteHostIP(void);
   DWORD BytesRemaining(void);
   DWORD BytesReceived(void);
   WORD GetRemotePort(void);
   BOOL SetRemotePort(WORD RemotePort);
   WORD GetState(void);
   SOCKET GetHandle(void);

定数リスト:以下の定数が利用できます。ほとんどは MSWINSCK.OCX と同じです。

 接続状態を示す定数
  sckClosed            0  //(既定値) 閉じています。
  sckOpen              1  //開いています。
  sckListening         2  //接続要求を待っています。
  sckConnectionPending 3  //接続がペンディング状態になっています。
  sckResolvingHost     4  //ホストの解決処理中です。
  sckHostResolved      5  //ホストの解決が完了しました。
  sckConnecting        6  //接続処理中です。
  sckConnected         7  //接続が完了しました。
  sckClosing           8  //相手側のマシンが接続を閉じようとしています。
  sckError             9  //エラー。

 エラーを示す定数(エラーの意味については、ソースの中の GetErrMsg() 関数を
          参照してください。すべてのエラーコードに対応しているわけでは
          ありません。)
  sckOpCanceled
  sckInvalidArgument
  sc0kWouldBlock
  sckInProgress
  sckAlreadyComplete
  sckNotSocket
  sckMsgTooBig
  sckPortNotSupported
  sckAddressInUse
  sckAddressNotAvailable
  sckNetworkSubsystemFailed
  sckNetworkUnreachable
  sckNetReset
  sckConnectAborted
  sckConnectionReset
  sckNoBufferSpace
  sckAlreadyConnected
  sckNotConnected
  sckSocketShutdown
  sckTimedout
  sckConnectionRefused
  sckNotInitialized
  sckHostNotFound
  sckHostNotFoundTryAgain
  sckNonRecoverableError
  sckNoData
  sckHostUnreachable
  sckInvalidOp
  sckOutOfMemory

 その他の定数(適宜、変更してください。)
  TCPSock.h
    MAX_HOST_LEN            //ホスト名の最大長(終端の '\0' を含む)
    MAX_HISTORY_SIZE        //平均速度の算出に用いる時間の長さ(秒)

  TCPSock.cpp
        MAX_TEMPSOCK            //一度に受け付ける接続要求の数
        MAX_CALLBACK            //プログラムで使用するソケットの総数

        RESIZE_AFTER_GETDATA    //TCPSock.cpp を参照してください。
        RESIZE_AFTER_SEND       //TCPSock.cpp を参照してください。

関数の解説:

 BOOL StartupSocket(void);
  Windowsソケットを初期化します。
  必ず他の関数を呼び出すより前に実行してください。
  戻り値が FALSE の場合は、ソケットを使えません。
  戻り値が TRUE だった場合は、プログラム終了前に WSACleanUp() を呼び出して
  ください。

 void CleanupSocket(void);
  Windowsソケットを終了します。
  プログラム終了前に呼び出してください。

 char *GetErrorMsg(DWORD ErrNo);
  エラーメッセージを取得します。
  エラーコードは GetLastError() で取得できます。
  日本語環境であれば日本語のエラーメッセージを返し、それ以外は英語のエラー
  メッセージを返します。

 DWORD GetHostByNameAlias(const char *strHostName);
  ホスト名からIPアドレスを取得します。
  失敗すると INADDR_NONE(0xFFFFFFFF)が返ります。
  推奨されません。次回のバージョンアップ時に削除される可能性があります。

 char *GetHostNameByAddr(DWORD lngHostIP);
  IPアドレスからホスト名を取得します。
  lngHostIP が INADDR_LOOPBACK(0x7F000001)の場合は、長さ0の文字列を
  返します。
  推奨されません。次回のバージョンアップ時に削除される可能性があります。

 void Initialize(void (*EventError)(DWORD ErrorCode) = NULL,
      void (*EventClose)(void) = NULL,
      void (*EventConnectionRequest)(SOCKET requestID) = NULL,
      void (*EventConnect)(void) = NULL,
      void (*EventDataArrival)(DWORD bytesTotal) = NULL);
  ソケットを初期化し、コールバック関数を設定します。
  パラメータには、Error イベント、Close イベント、ConnectionRequest 
  イベント、Connect イベント、DataArrival イベントの順で呼び出したい関数を
  指定します。
  コールバックの必要が無いイベントに対しては、NULL を渡すことができます。

 void Terminate(void);
  ソケットを終了し、コールバックを解除します。
  必ず、Close を呼び出して確実に閉じてからこの関数を呼び出してください。

 DWORD GetLastError(void);
  最後のエラーのエラーコードを取得します。
  エラーが無ければ0が返ります。

 BOOL Accept(DWORD requestID);
  Close 状態のソケットに対して、接続要求を受け入れます。
  requestID には、ConnectionRequest イベントで渡される requestID を使って
  ください。
  成功すると TRUE が返ります。

 BOOL Bind(WORD LocalPort);
  ソケットを指定されたポートにバインドします。
  成功すると TRUE が返ります。
  通常は、サーバー側だけが利用します。
  Listen() を呼び出す前に、Bind() する必要があります。

 void Close(void);
  ソケットを閉じます。

 BOOL Connect(void);
  クライアント側からサーバー側へ接続要求を送ります。
  予めサーバーのホスト名またはIPアドレスとポート番号を SetRemoteHost() 
  および SetRemotePort() で設定しておく必要があります。
  成功すると TRUE が返りますが、接続は完了していません。
  接続が完了すると、Connect イベントが発生します。
  また、GetState() の戻り値が sckConnected になったかどうかでも判断できます。

 BOOL GetData(char *Buffer, DWORD ReadByte);
  受信したデータを読み込みます。
  成功すると TRUE が返ります。

 BOOL Listen(void);
  サーバーがクライアントからの接続要求が届くのを待つようにします。
  事前に Bind() でポートを指定しておく必要があります。
  成功すると TRUE が返ります。
  接続要求が届くと、ConnectionRequest イベントが発生します。

 BOOL SendData(char *Buffer, DWORD WriteByte);
  データを送信します。
  成功すると TRUE が返りますが、その時点でデータが相手方に届いたわけでは
  ありません。

 char *GetLocalHost(void);
  ローカルホストの名前を返します。
  ローカルホストの名前は設定できません。

 char *GetLocalHostIP(void);
  ローカルホストのIPアドレスを XXX.XXX.XXX.XXX の形の文字列で返します。
  ローカルホストのIPアドレスは設定できません。

 WORD GetLocalPort(void);
  現在のローカルポートプロパティの値を取得します。

 BOOL SetLocalPort(WORD LocalPort);
  ローカルポートプロパティの値を設定します。
  成功すると TRUE が返ります。

 BOOL SetRemoteHost(char *RemoteHost);
  リモートホストプロパティの値を設定します。
  RemoteHost の長さは最後の '\0' を含めて MAX_HOST_LEN バイト以下に
  してください。
  成功すると TRUE が返ります。

 char *GetRemoteHost(void);
  現在のリモートホストプロパティの値を取得します。

 char *GetRemoteHostIP(void);
  リモートホストのIPアドレスを XXX.XXX.XXX.XXX の形の文字列で返します。
  接続中でないと正しい結果を返しません。

 DWORD BytesRemaining(void);
  送信バッファに残っているデータのサイズを返します。

 DWORD BytesReceived(void);
  受信バッファに溜まっているデータのサイズを返します。

 WORD GetRemotePort(void);
  現在のリモートポートプロパティの値を取得します。

 BOOL SetRemotePort(WORD RemotePort);
  リモートポートプロパティの値を設定します。
  成功すると TRUE を返します。

 WORD GetState(void);
  現在の状態を取得します。「接続状態を示す定数」の中のどれかが返ります。

 SOCKET GetHandle(void);
  ソケットのハンドルを取得します。
  戻り値が SOCKET_ERROR(0xFFFFFFFF) の時は無効なハンドルです。
  推奨されません。次回のバージョンアップ時に削除される可能性があります。

 void ResetSendStatistics(void);
  平均送信速度のデータをリセットします。

 void ResetReceiveStatistics(void);
  平均受信速度のデータをリセットします。

 DWORD GetSendStatistics(void);
  平均送信速度を「バイト/秒」で返します。
  0 になることもありますので、除算に使うときは注意してください。

 DWORD GetReceiveStatistics(void);
  平均受信速度を「バイト/秒」で返します。
  0 になることもありますので、除算に使うときは注意してください。

サンプルについて:
 サンプルとして、簡単なチャットプログラムを用意してあります。

注意:

 このモジュールは元来、Tiny File Transmitter のために作られたものです。
 今後、Tiny File Transmitter のバージョンアップに伴い、関数の追加や
 削除等が発生する可能性がありますので予めご了承ください。
 このモジュールは無償で使っていただいて構いませんが、発生した損害に
 対しては作者は一切責任を取れません。
 バグがあった場合は、作者までご一報くださると嬉しいです。
 また、バージョンアップ・バグ情報の通知が必要な方も、
 作者までご一報ください。

           http://hp.vector.co.jp/authors/VA022513/
           a5497108@anet.ne.jp                       PANDA

履歴:
 2000/12/08  version 0.01 を公開しました。
 2001/02/15  ホームページ移転のためドキュメントを一部修正しました。
 2001/03/27  ホームページ移転のためドキュメントを一部修正しました。
 2002/08/01  version 0.02 を公開しました。
         送受信の平均速度を取得できるようにしました。

戻る