Newer
Older
snipet / FTPM / trunk / src / client / client.c
/**
 * 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 ----- */