ライブラリの使用例題

使用例題として,登録済みの伝送カード(伝送カード名:CARD1~3)を使用して,非同期の伝送要求の登録と,終了結果の取得をするサンプルプログラムを次に示します。例題は,Visual C++ 6.0の場合です。

図7-1 サンプルプログラムフローチャート

[図データ]

/**********************************************************/
/* 非同期伝送要求の登録と終了結果の取得サンプルプログラム */
/*   (登録済カードを使用した場合)                       */
/**********************************************************/
#include <windows.h>
#include <stdio.h>
#include <winsock.h>
#include <apihead.h>

#define CARD1   "card1"
#define CARD2   "card2"
#define CARD3   "card3"

#define FTS_EXECUTION   0
#define FTS_SUCCESS     1

#define FTS_MAX_RETRY   3

int main()
{
   FTS_FTP_API_DATA_EX data1, data2, data3;    /* 伝送情報構造体 */
   FTS_FTP_API_RETDATA_EX  ret_data;           /* 伝送終了情報構造体 */
   SOCKET sock;
   WSADATA WSAData;
   DWORD trno1, trno2, trno3;
   DWORD status;
   int flag1, flag2, flag3;
   int err_num;
   int i;

   /******************************************************/
   /* ソケットルーチンの初期化(必ずコールしてください) */
   /******************************************************/
   status = WSAStartup( MAKEWORD(1,1), &WSAData );
   if( status ) {
       /* エラー発生 */
       printf( "WSAStartup() error number = %d¥n", status );
       return 1;
   }

   flag1 = FTS_EXECUTION;
   flag2 = FTS_EXECUTION;
   flag3 = FTS_EXECUTION;

   for( i = 0; i <= FTS_MAX_RETRY; i++ ) {
       if( i == 0 ) {
           printf( "Transmission is executed. ¥n" );
       } else {
           printf( "Transmission is executed again.¥n" );
       }

       memset( &data1, 0, sizeof(FTS_FTP_API_DATA_EX) );
       memset( &data2, 0, sizeof(FTS_FTP_API_DATA_EX) );
       memset( &data3, 0, sizeof(FTS_FTP_API_DATA_EX) );

       /**************************************************/
       /* ファイル伝送サーバ/FTPとのコネクション確立 */
       /**************************************************/
       sock = fts_ftp_open( NULL );
       if( sock == INVALID_SOCKET ) {
           /* エラー発生 */
           err_num = WSAGetLastError();
           printf( "fts_ftp_open() error!! error number = %d¥n", err_num );
           WSACleanup();
           return 1;
       }

       /******************/
       /* 伝送要求の登録 */
       /******************/
       if( flag1 == FTS_EXECUTION ) {
           if( !fts_ftp_asyn_request_ex( sock, CARD1, &data1, &trno1, FTS_GET_RETURN ) ) {
               /* エラー発生 */
               err_num = WSAGetLastError();
               printf( "fts_ftp_request_ex(1) error!! error number = %d¥n", err_num );
           }
       }
       if( flag2 == FTS_EXECUTION ) {
           if( !fts_ftp_asyn_request_ex( sock, CARD2, &data2, &trno2, FTS_GET_RETURN ) ) {
               /* エラー発生 */
               err_num = WSAGetLastError();
               printf( "fts_ftp_request_ex(2) error!! error number = %d¥n", err_num );
           }
       }
       if( flag3 == FTS_EXECUTION ) {
           if( !fts_ftp_asyn_request_ex( sock, CARD3, &data3, &trno3, FTS_GET_RETURN ) ) {
               /* エラー発生 */
               err_num = WSAGetLastError();
               printf( "fts_ftp_request_ex(3) error!! error number = %d¥n", err_num );
           }
       }

       /******************/
       /* 終了結果の取得 */
       /******************/
       while(1) {
           if( !fts_ftp_event_ex( sock, &ret_data ) ) {
               err_num = WSAGetLastError();
               if( err_num == FTS_API_ERROR_NODATA ) {
                   /* すべての終了結果を取得した */
                   break;
               } else {
                   /* エラー発生 */
                   printf( "fts_ftp_event_ex error!! error number = %d¥n", err_num );
                   fts_ftp_close( sock );
                   WSACleanup();
                   return 1;
               }
           }
           if( flag1 == FTS_EXECUTION ) {
               if( ret_data.trno == trno1 ) {
                   /* CARD1の終了 */
                   if( ret_data.trans_status == TRANS_SUCCESS ) {
                       /* 伝送が正常終了 */
                       printf( "CARD1 trnas success!!¥n" );
                       flag1 = FTS_SUCCESS;
                   } else {
                       /* 伝送が異常終了 */
                       printf( "CARD1 trnas failure!!¥n" );
                   }
                   continue;
               }
           }
           if( flag2 == FTS_EXECUTION ) {
               if( ret_data.trno == trno2 ) {
                   /* CARD2の終了 */
                   if( ret_data.trans_status == TRANS_SUCCESS ) {
                       /* 伝送が正常終了 */
                       printf( "CARD2 trnas success!!¥n" );
                       flag2 = FTS_SUCCESS;
                   } else {
                       /* 伝送が異常終了 */
                       printf( "CARD2 trnas failure!!¥n" );
                   }
                   continue;
               }
           }
           if( flag3 == FTS_EXECUTION ) {
               if( ret_data.trno == trno3 ) {
                   /* CARD3の終了 */
                   if( ret_data.trans_status == TRANS_SUCCESS ) {
                       /* 伝送が正常終了 */
                       printf( "CARD3 trnas success!!¥n" );
                       flag3 = FTS_SUCCESS;
                   } else {
                       /* 伝送が異常終了 */
                       printf( "CARD3 trnas failure!!¥n" );
                   }
                   continue;
               }
           }
       }

       /**************************************************/
       /* ファイル伝送サーバ/FTPとのコネクション解放 */
       /**************************************************/
       fts_ftp_close( sock );

       if( flag1 == FTS_SUCCESS && flag2 == FTS_SUCCESS && flag3 == FTS_SUCCESS ) {
           break;
       }
   }
   /****************************************************/
   /* ソケットルーチンの解放(必ずコールしてください) */
   /****************************************************/
   WSACleanup();

   printf( "Transmission is ended. ¥n" );

   return 0;
}