使用例題として,登録済みの伝送カード(伝送カード名:CARD1~3)を使用して,非同期の伝送要求の登録と,終了結果の取得をするサンプルプログラムを次に示します。
図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;
}