ネットdeダビングのクライアントソフトを作る(その3)

 前回作ったFTPサーバは2GB/4GB以上のファイルの送受信が行えないのでソース先頭に次の2行を追加した。

#define _FILE_OFFSET_BITS 64
#define _LARGEFILE_SOURCE

 また、FTPサーバに同名のファイルをアップロードすると上書きされてしまうので、書き込む前にファイルを読み込みモードで開いて同名ファイルがあるか確認するようにした。同名ファイルがあれば開けるのでファイル名に連番を付加して開けなくなるまで繰り返した後、書き込みモードで開くように「fp=fopen(cmd2,"wb");」の部分を以下のように変更した。

	strcpy(buf,cmd2);
	i=0;
	while(1) {
		fp=fopen(buf,"rb");
		if(fp==NULL) break;
		rc=fclose(fp);
		i++;
		sprintf(buf,"%s.%d",cmd2,i);
	}
	fp=fopen(buf,"wb");

 これをWindowsでもWinsockを使ってコンパイル出来るように「#include <unistd.h>」、「#include <sys/types.h>」、「#include <sys/socket.h>」、「#include <netinet/in.h>」、「#include <arpa/inet.h>」を「#include <winsock2.h>」に変更し、「WSADATA wsaData;」を定義した上で最初に「WSAStartup(MAKEWORD(2,0),&wsaData);」を最後に「WSACleanup();」を追加、socketの戻り値などはint型ではなくSOCKET型で定義、bindなどで指定するsockaddr_in構造体の大きさはsocklen_t型ではなくint型で定義、close関数はclosesocket関数に置き換え、コンパイル時に-lws2_32オプションを付加することで、無事コンパイルして動作することを確認した。
 あとはダビングされたタイトル(datファイル)の番組情報をLANDE-RD等と同様のフォーマットでテキストファイルに出力するネットdeダビング情報ソフト(rdinf)を作ってみた。引数にdatファイルを指定して実行すると標準出力に番組情報をシフトJISコードで出力する。

#include <stdio.h>

int main(int argc,char *argv[]) {
	FILE *fp;
	unsigned char buf[1208],str[801];
	int i;

	fp=fopen(argv[1],"rb");
	fread(buf,1,1208,fp);
	fclose(fp);
	printf("%c%c%c%c%c%c:\r\n",0x94,0xd4,0x91,0x67,0x96,0xbc);
	for(i=0;i<64;i++) str[i]=buf[i+0x0084];
	str[i]='\0';
	printf("%s\r\n\r\n",str);
	printf("%c%c%c%c%c%c%c%c:\r\n",0x94,0xd4,0x91,0x67,0x8f,0xda,0x8d,0xd7);
	for(i=0;i<800;i++) str[i]=buf[i+0x00cc];
	str[i]='\0';
	printf("%s\r\n\r\n",str);
	printf("%c%c%c%c%c%c%c%c:\r\n",0x98,0x5e,0x89,0xe6,0x93,0xfa,0x8e,0x9e);
	for(i=0;i<2;i++) str[i]=buf[i+0x0062];
	str[i]='\0';
	printf("%s/",str);
	for(i=0;i<2;i++) str[i]=buf[i+0x0064];
	str[i]='\0';
	printf("%s/",str);
	for(i=0;i<2;i++) str[i]=buf[i+0x0066];
	str[i]='\0';
	printf("%s ",str);
	for(i=0;i<2;i++) str[i]=buf[i+0x006c];
	str[i]='\0';
	printf("%s:",str);
	for(i=0;i<2;i++) str[i]=buf[i+0x006e];
	str[i]='\0';
	printf("%s-",str);
	for(i=0;i<2;i++) str[i]=buf[i+0x0070];
	str[i]='\0';
	printf("%s:",str);
	for(i=0;i<2;i++) str[i]=buf[i+0x0072];
	str[i]='\0';
	printf("%s\r\n\r\n",str);
	printf("%c%c%c%c%c%c%c%c%c%c%c%c:\r\n",0x83,0x60,0x83,0x83,0x83,0x93,0x83,0x6c,0x83,0x8b,0x96,0xbc);
	for(i=0;i<132;i++) str[i]=buf[i+0x0434];
	str[i]='\0';
	printf("%s\r\n",str);
	return 0;
}