• 検索結果がありません。

目次 1. DB 更新情報受信 SW 仕様書 構成および機能 全体の構成 DB 更新情報受信 SW の機能 ソフトウェアの設計仕様 DB 更新情報受信 SW の仕様 資料編... 5

N/A
N/A
Protected

Academic year: 2021

シェア "目次 1. DB 更新情報受信 SW 仕様書 構成および機能 全体の構成 DB 更新情報受信 SW の機能 ソフトウェアの設計仕様 DB 更新情報受信 SW の仕様 資料編... 5"

Copied!
9
0
0

読み込み中.... (全文を見る)

全文

(1)

書類トレースシステム「DigiTANAlog」

メインサーバマシン

DB 更新情報受信 SW 仕様書

Create on 良知洋志 (RACHI, Hiroshi)

Date: 2006/02/08

Last Update: 2006/02/15

(2)

目次

1. DB 更新情報受信 SW 仕様書 ... 2

1-1. 構成および機能...2

1-1-1. 全体の構成...2

1-1-2. DB 更新情報受信 SW の機能 ...2

1-2. ソフトウェアの設計仕様...3

1-2-1. DB 更新情報受信 SW の仕様 ...3

2. 資料編 ... 5

2-1. 資料 1. ソフトウェアのソースコード ...5

2-1-1. DB 更新情報受信 SW のソースコード...5

(3)

1. DB 更新情報受信 SW 仕様書

1-1. 構成および機能

書類トレースシステム「DigiTANAlog」(以下「本システム」)におけるメインサーバマシン上

で動作する

DB 更新情報受信 SW の構成および機能を以下に記す。

1-1-1. 全体の構成

メインサーバ上で動作している

DB 更新情報受信 SW がトレース用端末「BookShelf」(以下

「BookShelf」)から情報を受信した際、その抜差し口番号およびカード ID 番号から同マシン上

で動作している

DB 更新 SW にアクセスするための URL を生成し、それを HTTP リクエストと

して同マシン上で動作している

HTTP サーバへ送信することで、データベースの更新を完了する。

1-1-2. DB 更新情報受信 SW の機能

DB 更新情報受信 SW は、トレース用端末「BookShelf」(以下「BookShelf」)から送信された

カード状態変化情報を受信し、

DB 更新 SW にアクセスするソフトウェアである。DB 更新情報受

SW はメインサーバマシン上で動作している。

メインサーバ上で動作している

DB 更新情報受信 SW がトレース用端末「BookShelf」(以下

「BookShelf」)から情報を受信した際、その抜差し口番号およびカード ID 番号から同マシン上

で動作している

DB 更新 SW にアクセスするための URL を生成し、それを HTTP リクエストと

して同マシン上で動作している

HTTP サーバへ送信する。

情報受信の際には、通信プロトコルは

TCP を、ポート番号は 12345 番を用いる。

BookShelf から送信される情報は、まずは文字列であり、バッファに格納されるため、それを

抜差し口番号およびカード

ID 番号の数値に変換する。この際の各番号は、BookShelf 上の H8 マ

イコンですでにデータベースの仕様に合わせたものであるため、手を加えることを必要とせずに、

DB 更新 SW にアクセスするための URL を生成することが出来る。

生成された

URL をバッファに格納し、「HTTP リクエスト送信」関数にその文字列を渡すこと

で、HTTP リクエストの送信を完了する。

プログラムの起動は、本システム構築時に行う。なお、実行時にはコマンドプロンプトウィン

ドウが表示され、動作確認用に送信

URL と HTTP サーバからの応答が表示される。

(4)

1-2. ソフトウェアの設計仕様

本システムにおけるメインサーバマシン上で動作する

DB 更新情報受信 SW の仕様を以下に記

す。

なお、ソースコードは資料

1.を参照していただきたい。

1-2-1. DB 更新情報受信 SW の仕様

DB 更新情報受信 SW は、トレース用端末「BookShelf」(以下「BookShelf」)から送信された

カード状態変化情報を受信し、

DB 更新 SW にアクセスするソフトウェアである。DB 更新情報受

SW はメインサーバマシン上で動作している。

メインサーバ上で動作している

DB 更新情報受信 SW がトレース用端末「BookShelf」(以下

「BookShelf」)から情報を受信した際、その抜差し口番号およびカード ID 番号から同マシン上

で動作している

DB 更新 SW にアクセスするための URL を生成し、それを HTTP リクエストと

して同マシン上で動作している

HTTP サーバへ送信する。

BookShelf から送信される情報は、BookShelf 上の H8 マイコンですでにデータベースの仕様

に合わせたものであるため、

DB 更新情報受信 SW では受信した抜差し口番号およびカード ID 番

号に手を加えることを必要とせずに、

DB 更新 SW にアクセスするための URL を生成することが

出来る。

DB 更新情報受信 SW の流れ図は、以下の通りである。

TCP を、ポート番号は 12345 番を用いる。

(5)

生成された

URL をバッファに格納し、「HTTP リクエスト送信」関数にその文字列を渡すこと

で、HTTP リクエストの送信を完了する。

HTTP リクエスト送信

引数に

URL 文字列を与えて実行する。引数として与えた文字列から「スキーム名」

「サーバ名」

「取得するページのパス」

「ポート番号」を取得し、HTTP サーバにアクセスする。

「HTTP リクエスト送信」関数は以下の引数と返り値を持つ。

int http_c(char * argv) 引数 概要 char * argv char 型 addr。

HTTP リクエストとして送信する URL 文字列へのアドレス。 返り値 int 型。

送信成功したとき0、失敗したとき−1。

(6)

2. 資料編

2-1. 資料 1. ソフトウェアのソースコード

本システムにおけるメインサーバマシン上で動作する

DB 更新情報受信 SW のソースコードを

以下に記す。

2-1-1. DB 更新情報受信 SW のソースコード

以下に、DB 更新情報受信 SW のソースコードを掲載する。

#include <winsock2.h> #include <stdio.h> #include <string.h> #define BUFSIZE 256 /* バッファサイズ */ #define RECVSIZE 4096 /* 受信バッファサイズ */ int http_c(char * argv);

int main(){

WSADATA wsaData; SOCKET sock0;

struct sockaddr_in addr; struct sockaddr_in client; int len; SOCKET sock; BOOL yes = 1; char inbuf[2048]; int pos = 0; int id = 0; WSAStartup(MAKEWORD(2,0), &wsaData); sock0 = socket(AF_INET, SOCK_STREAM, 0); addr.sin_family = AF_INET;

addr.sin_port = htons(12345);

addr.sin_addr.S_un.S_addr = INADDR_ANY;

setsockopt(sock0, SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, sizeof (yes));

bind(sock0, (struct sockaddr *)&addr, sizeof(addr)); listen(sock0, 5);

(7)

http_c(inbuf); if(inbuf[0] == '!') break; } closesocket(sock0); WSACleanup(); return 0; }

int http_c(char * argv){ WORD wVersionRequested; int nErrorStatus; WSADATA wsaData;

char svName[BUFSIZE]; /* サーバのドメイン名 */ char html[BUFSIZE]; /* 取得するページのパス */ unsigned short port = 80; /* ポート番号 */

int soc; /* ソケット(Soket Descriptor) */ long serveraddr; /* サーバの IP アドレス */

struct hostent *serverhostent; /* サーバの情報を指すポインタ * /

struct sockaddr_in serversockaddr; /* サーバのアドレス */ char sendbuf[BUFSIZE]; /* 送信バッファ */ char recvbuf[RECVSIZE]; /* 受信バッファ */ int buf_len; /* 受信したバイト数 */ char *p,*r,*t,wk[8]; /* 作業用領域 */ int i; /*---*/ /* 引数の URL からサーバ名とページのパスを取得する */ /*---*/ /* スキーム名を取得する */

for(i = 0;i < 7;i++){ wk[i] = argv[i]; } wk[i] = '¥0'; if(strcmpi(wk,"http://") != 0){ fprintf(stderr,"Error: http の URL ではありません¥n"); return -1; } /* サーバ名を取得する */

for(p = argv + i,r = svName;*p != '/' && *p != '¥0';p++,r++){ *r = *p; } *r = '¥0'; /* 取得するページのパスを取得する */ for(r = html;*p != '¥0';p++,r++){ *r = *p; } *r = '¥0'; /* サーバ名:ポート となっている場合は分割する */

(8)

if(*p == ':'){

for(t = p + 1,r = wk;*t != '¥0';t++,r++){ *r = *t;

}

*r = '¥0';

port = (unsigned short)atoi(wk); *p = '¥0'; } /* ページの指定が無い場合は、/ (ルート)を設定する */ if(strcmp(html,"") == 0){ strcpy(html,"/"); } /*---*/ /* 指定のサーバから指定のページを取得する */ /*---*/ /* WinSock の初期化を行う */ wVersionRequested = MAKEWORD(1,1); /* バージョン 1.1 を要求する */

nErrorStatus = WSAStartup(wVersionRequested, &wsaData);

if(atexit((void (*)(void))(WSACleanup))){ /* 終了時に WinSoc k のリソースを解放するようにしておく */ fprintf(stderr,"Error: atexit(WSACleanup)失敗¥n"); return -1; } if(nErrorStatus != 0){ fprintf(stderr,"Error: WinSock の初期化失敗¥n"); return -1; } /* soc にソケットを作成します */ soc = socket(PF_INET,SOCK_STREAM,0); if(soc == INVALID_SOCKET){ fprintf(stderr,"Error: Socket 作成失敗¥n"); return -1; } /* svName にドットで区切った 10 進数の IP アドレスが入っている場合、serveraddr に 3 2bit 整数の IP アドレスが返ります */ serveraddr = inet_addr((char*)svName); if(serveraddr == -1) { /* サーバ名(svName)からサーバの情報を取得します */ serverhostent = gethostbyname(svName); if(serverhostent == NULL) { fprintf(stderr,"Error: ホストアドレス取得失敗¥n");

(9)

/* サーバのアドレスの構造体にサーバの IP アドレスとポート番号を設定します */ serversockaddr.sin_family = AF_INET; /* イン ターネットの場合 */

serversockaddr.sin_addr.s_addr = serveraddr; /* サ ーバの IP アドレス */

serversockaddr.sin_port = htons((unsigned short)port); /* ポート番号 */

memset(serversockaddr.sin_zero,(int)0,sizeof(serversockaddr.sin_zer o));

/* サーバへ接続します */

if(connect(soc,(struct sockaddr *)&serversockaddr,sizeof(serversockadd r)) == SOCKET_ERROR){ fprintf(stderr,"Error: サーバへの接続失敗¥n"); /* ソケットを破棄する */ closesocket(soc); return -1; } /* サーバに GET リクエストを送信します */ /* 送信した文字列はサーバに届きます */

sprintf(sendbuf,"GET %s HTTP/1.0¥r¥nHost: %s:%d¥r¥nUser-Agent: httpc/ 0.0¥r¥n¥r¥n",html,svName,port); /* リクエストヘッダを作成する */ if(send(soc,sendbuf,strlen(sendbuf),0) == SOCKET_ERROR){ fprintf(stderr,"Error: サーバへの送信失敗¥n"); /* 送受信を無効にする */ shutdown(soc,2); /* ソケットを破棄する */ closesocket(soc); return -1; } /* サーバからデータをすべて受信し終わるまで繰り返す */ while(1){ /* サーバからデータを受信します */ buf_len = recv(soc,recvbuf,RECVSIZE - 1,0); if(buf_len == SOCKET_ERROR){ /* 受信失敗の場合 */ fprintf(stderr,"Error: サーバからの受信失敗¥n"); break; }else if(buf_len == 0){ /* 受信終わり */ break; } recvbuf[buf_len] = '¥0'; /* 受信バッファの後ろに NULL を付加する */ printf("%s",recvbuf); /* 標準出力する */ } /* 送受信を無効にする */ shutdown(soc,2); /* ソケットを破棄する */ closesocket(soc); return 0; }

参照

関連したドキュメント

地域の名称 文章形式の表現 卓越もしくは変化前 断続現象 変化後 地域 風向 風向(数値) 風速 風力 起時

当社は、お客様が本サイトを通じて取得された個人情報(個人情報とは、個人に関する情報

【原因】 自装置の手動鍵送信用 IPsec 情報のセキュリティプロトコルと相手装置の手動鍵受信用 IPsec

ウェブサイトは、常に新しくて魅力的な情報を発信する必要があります。今回制作した「maru 

備 考 瀬戸内海 300m 500m 1000m.

Google マップ上で誰もがその情報を閲覧することが可能となる。Google マイマップは、Google マップの情報を基に作成されるため、Google

例1) 自社又は顧客サーバの増加 例2) 情報通信用途の面積増加. 例3)

建築基準法施行令(昭和 25 年政令第 338 号)第 130 条の 4 第 5 号に規定する施設で国土交通大臣が指定する施設. 情報通信施設 情報通信 イ 電気通信事業法(昭和