/** * FTPM(FTPもどき) * Client側プログラム **/ #include <stdio.h> #include <string.h> #include <nstdc_socket.h> static const char commandFname[] = "n:"; /* ファイル名指定コマンド */ static const char commandFtrans[] = "t:"; /* ファイル送信コマンド */ static const char end[] = "\n"; /* 末尾 */ char *getFileName( char *filePath ); #define SEND_SIZE 256 /* ソケットを生成し、サーバーへ指定ファイルを転送する。 */ int main( int argc, char *argv[] ){ struct sockaddr_in server; /* 接続先サーバー */ int sock; char* filePath; /* 転送ファイルパス */ char* fileName; /* 転送ファイル名 */ FILE *fp; /* 転送ファイル */ char buf[SEND_SIZE]; /* 送信データ */ size_t size; /* 送信データサイズ */ /* 引数はファイルパスのみとする。 */ if( argc != 2 ){ printf("ERROR ARG\n"); return -1; } else { filePath = argv[1]; fileName = getFileName( filePath ); } /* ソケットの生成 */ sock = socket( AF_INET, SOCK_STREAM, 0 ); /* 接続先情報 */ server.sin_family = AF_INET; /* IPv4 */ server.sin_port = htons( 21080 ); /* 接続先ポート番号 */ server.sin_addr.s_addr = inet_addr( "127.0.0.1" ); /* 接続先IPアドレス*/ /* サーバーに接続 */ connect( sock, ( struct sockaddr * )&server, sizeof( server )); /* ファイル名指定コマンドを送信する。 */ send( sock, commandFname, (int)strlen(commandFname), 0 ); send( sock, fileName, (int)strlen(fileName), 0 ); send( sock, end, (int)strlen(end), 0 ); /* ファイル転送コマンドでファイルを送信する。 */ send( sock, commandFtrans, (int)strlen(commandFtrans), 0); /* 転送対象ファイルを読み取り専用で開く */ fp = fopen( filePath, "r"); if(fp == NULL){ printf("ERROR File not open.\n"); return -1; } /* ファイルの終端までデータを読み取り送信する */ while( feof(fp) == 0 ){ size = fread( buf, sizeof( char ), sizeof( buf ), fp ); send( sock, buf, size, 0); } /* 読み取り完了でファイルをクローズする */ fclose( fp ); /* socketの終了 */ close( sock ); return 0; } /* ファイルパスからファイル名を取得する */ char *getFileName( char *filePath ){ int len = strlen( filePath ); int i; int pos; printf("PATH:%s(%d)\n", filePath, len); /* 末尾から"/"を検索する */ for( i = len - 1 ; i > 0; i-- ){ if( filePath[i] == '/' ){ break; } } /* 末尾が"/"だった場合、ファイル名が空としてエラー */ if( i == len -1 ){ printf("ERROR no name\n"); return NULL; } /* "/"の後ろからファイル名を取得する。 */ if( i == 0 ){ pos = 0; } else { pos = i + 1; } printf("NAME:%s\n", &filePath[pos]); return &filePath[pos]; } /* ----- EOF ----- */