8b6961a29be612dd05c496abb390c8635008901c
[profile/ivi/ico-vic-carsimulator.git] / include / timeMeasureTool.h
1 /**
2  * @file    timeMeasureTool.h
3  * @brief   検証用ソケット通信機能
4  *
5  * @author  TTDC
6  * @date    2012-08-07 新規作成
7  *
8  * Copyright (c) 2012 TOYOTA MOTOR CORPORATION.
9  * (Insert a Licence Condition Here.)
10  */
11
12 #ifdef __cplusplus
13 extern "C"
14 {
15 #endif
16
17 #include    <stdio.h>           /* C言語標準ヘッダ類            */
18 #include    <stdlib.h>
19 #include    <unistd.h>
20 #include    <stdbool.h>
21 #include    <string.h>
22 #include    <time.h>
23 #include    <sys/types.h>
24 #include    <sys/time.h>
25 #include    <sys/mman.h>
26 #include    <sys/stat.h>
27 #include    <fcntl.h>
28 #include    <sys/socket.h>
29 #include    <netinet/in.h>
30 #include    <arpa/inet.h>
31 #include    <signal.h>
32 #include    <errno.h>
33 #include    <pthread.h>
34 #include    <ctype.h>
35
36 /* ビルドコンフィグレーション          */
37 #define VEHICLEINFO_DAEMON_COEXIST  1   /* マスターとスレーブを同一CPUに置く場合には1にする */
38     /* この場合、共有メモリやライブラリとの通信ポートを別にする */
39
40 #define VEHICLEINFO_DAEMON_INET 1       /* Linux内 Daemon〜Library間通信のドメイン    */
41     /*   0=UNIXドメイン(AF_UNIX)を使用する       */
42     /*   1=INETドメイン(AF_INET)を使用する       */
43     /*   UNIXドメインの方が性能的には有利だが、    */
44     /*   SMACK色々不自由な点も多いので、INETを使う。 */
45
46 /* コンフィグレーション           */
47 #define WEBSOCKET6          0   /* WebSocketnのプロトコルバージョン6対応   */
48     /*  (厳密な試験はしていないので、使う場合は  */
49     /*   試験実施のこと)                     */
50
51 /* 各種定義値                  */
52 #define DEFAULT_HOST        "127.0.0.1" /* 既定のマスタのホスト名(localhost) */
53 #define DEFAULT_PORT        39200       /* 既定のポート番号ベース                */
54 #define DEFAULT_PORT_WB     39201       /* 既定のポート番号ベース(WebSocket用)  */
55 #define DEFAULT_PORT_NT     39202       /* 既定のポート番号ベース(Native用)     */
56 #define DEFAULT_PORT_NT2    39203       /* 既定のポート番号ベース(Native用)     */
57 #define VEHICLEINFO_MAX_LOG_LINES   5000        /* ログのファイル当たりの最大行数        */
58 #define MEASURE_MAX_LOG_FILES   10      /* ログの最大個数                        */
59
60 #define CONNECT_TIMER 10        /* ソケットConnect待ち時間(秒) */
61 #define CONNECT_WAIT        (200)       /* マスタとの接続リトライ時間(ミリ秒単位) */
62 #define CLIENT_BIND_WAIT    (180*1000)  /* Bind失敗時の最大待ち時間(ミリ秒単位)      */
63 #define TRANSLOG_NUM        (240)       /* 転送ログ蓄積個数                         */
64
65 #define DAEMON_MASTER       (0) /* 自身がマスターデーモン                    */
66 #define DAEMON_SLAVE        (1) /* 自身がスレーブデーモン                    */
67 #define DAEMON_NAME         "timeMeasureRecv"   /*自身のデーモン名                  */
68
69 /* システム制限値                */
70 #define VEHICLEINFO_MAX_PRIV            8       /* 読み込み/書き込み権限の最大値      */
71 #define VEHICLEINFO_MAX_CLIENT          50      /* 最大クライアント(Library)数         */
72 #define VEHICLEINFO_WEBSOCKET_MAXPROT   128     /* WebSocketのプロトコル処理の最大電文長(CR,LFを含む) */
73 #define TEST_WEBSOCKET_MAXPROT  1024*1024       /* WebSocketのプロトコル処理の最大電文長(CR,LFを含む) */
74 #define MEASURE_SOCKET_MAXDATA  2048    /* Socketの最大電文長(CR,LFを含む) */
75
76 /* ファイルディレクトリ           */
77 #define MEASURE_LOG_DIR     "/var/log/vehicleinfo/log"
78     /* ログ出力先ディレクトリ                */
79
80 /* 接続状態                         */
81 #define CONNSTAT_UNKNOWN          0     /* 不明                                     */
82 #define CONNSTAT_DATA      1    /* WebSocket,データ転送中                 */
83 #define CONNSTAT_DATA_NT   3    /* NativeのSocket,データ転送中               */
84 #define CONNSTAT_HS0       10   /* WebSocket,ハンドシェイク中(GET未受信)    */
85 #define CONNSTAT_HS1       11   /* WebSocket,ハンドシェイク中(キー未受信)   */
86 #define CONNSTAT_HS2       12   /* WebSocket,ハンドシェイク中(キー受信済)   */
87 #if     WEBSOCKET6              /* WebSocket旧プロトコル(バージョン6)対応   */
88 #define CONNSTAT_HS11     21    /* WebSocket旧プロトコル、Key1受信Key2未受信 */
89 #define CONNSTAT_HS12     22    /* WebSocket旧プロトコル、Key2受信Key1未受信 */
90 #define CONNSTAT_HS13     23    /* WebSocket旧プロトコル、Key1,2受信済、空行待ち */
91 #define CONNSTAT_HS14     24    /* WebSocket旧プロトコル、Key1,2受信済、ボディ待ち */
92 #define CONNSTAT_DATA6    2     /* WebSocket,データ転送中(旧プロトコル)     */
93 #endif  /*WEBSOCKET6*/                        /* WebSocket旧プロトコル(バージョン6)対応   */
94
95 /* 受信データ保持バッファ                */
96     typedef struct T_MEASURE_SAVEDATA_t
97     {
98         unsigned short Size;    /* 保持しているバイト数           */
99         unsigned short BufSize; /* バッファの大きさ(バイト数)   */
100         char *Buf;              /* 保持データ(動的アロケーション) */
101     } S_MEASURE_SAVEDATA_t;
102
103 /* クライアント管理テーブル         */
104     typedef struct T_MEASURE_MNG_t
105     {
106         int Socket;             /* ソケット(ファイルディスクリプタ)         */
107         short ConnStat;         /* 接続状態                                 */
108         char Res[2];            /* (空き)                                 */
109         S_MEASURE_SAVEDATA_t SaveData;  /* 受信データ保持バッファ                   */
110 #if     WEBSOCKET6              /* WebSocket旧プロトコル(バージョン6)対応   */
111         int Key1;               /* WebSocketのKey1                          */
112         int Key2;               /* WebSocketのKey2                          */
113 #endif  /*WEBSOCKET6*/                        /* WebSocket旧プロトコル(バージョン6)対応   */
114     } S_MEASURE_MNG_t;
115
116 /* 転送ログ                 */
117 #define TRANSLOG_INFO_START     0x0201  /* 情報ログ(処理開始)                       */
118 #define TRANSLOG_INFO_END       0x0202  /* 情報ログ(処理終了)                       */
119 #define TRANSLOG_INFO_DOWN      0x0203  /* 情報ログ(異常終了)                       */
120 #define CLILOG_SEND_WSDT        0x1021  /* クライアントへの送信ログ(WebSocketデータ) */
121 #define CLILOG_RECEIVE_WSDT     0x1022  /* クライアントからの受信ログ(WebSocketデータ) */
122 #define CLILOG_RECEIVE_NTDT     0x1023  /* クライアントからの受信ログ(Nativeデータ) */
123 #if     WEBSOCKET6              /* WebSocket旧プロトコル(バージョン6)対応   */
124 #define CLILOG_SEND_WSDT6       0x1021  /* クライアントへの送信ログ(WebSocketデータ) */
125 #define CLILOG_RECEIVE_WSDT6    0x1022  /* クライアントからの受信ログ(WebSocketデータ) */
126 #define CLILOG_RECEIVE_NTDT6    0x1023  /* クライアントからの受信ログ(Nativeデータ) */
127 #endif  /*WEBSOCKET6*/                        /* WebSocket旧プロトコル(バージョン6)対応   */
128 #define CLILOG_SEND_WSHS        0x1031  /* クライアントへの送信ログ(WebSocketハンドシェイク) */
129 #define CLILOG_RECEIVE_WSHS     0x1032  /* クライアントからの受信ログ(WebSocketハンドシェイク) */
130 #define CLILOG_CONNECT          0x1101  /* クライアントとの接続ログ                 */
131 #define CLILOG_DISCONNECT       0x1102  /* クライアントとの切断ログ                 */
132
133 #define MEASURELOG_MAX_STR    1024      /* ログの文字列の最大サイズ                 */
134 #define MEASURE_CLILOG_MAX_STR  (sizeof(struct timeval) + MEASURELOG_MAX_STR)
135
136     typedef struct T_MEASURELOG_t
137     {
138         short LogType;          /* ログの種別                               */
139         short Id;               /* 車両情報ID(クライアントならクライアントID) */
140         short Size;             /* データサイズ                             */
141         short Info;             /* 付加情報                                 */
142         struct timeval Time;    /* 送受信時刻(自マシンの日付時刻)           */
143         struct timeval DataTime;        /* データ更新日付時刻(自マシンの日付時刻)   */
144         union
145         {
146             short Svalue;
147             int Ivalue;
148             long long Lvalue;
149             float Fvalue;
150             double Dvalue;
151             char Cvalue[MEASURELOG_MAX_STR + 1];
152             /* 文字列は256文字                            */
153         } d;                    /* 送受信データ                               */
154     } S_MEASURELOG_t;
155
156 // スレッド起動時引数
157     typedef struct T_NTRECV_t
158     {
159         int Socket;             // ソケット番号
160         int nRcvBufSize;        // 受信バッファサイズ
161         FILE *LogFd;            // ログファイルポインタ
162         int client_idx;         // クライアント番号
163         pthread_mutex_t printLock;      // ログ出力時ミューテクス
164     } S_NTRECV_t;
165
166 /* 内部関数のプロトタイプ宣言(RECV)            */
167     void DisconnectClient(int ClientID);
168     /* クライアントとの回線切断処理               */
169     int ClientHandShake(int ClientID);  /* クライアントからのハンドシェイク受信       */
170     int ClientRequest(int ClientID);    /* クライアントからの要求受信              */
171     void *NativeRecieve(void *);        /* Nativeソケット受信関数 */
172
173
174 /* 内部関数のプロトタイプ宣言(SEND)            */
175     void TEST_SOCKET_CLOSE();
176     char *TEST_GET_TIME();
177     double TEST_GET_TIME2();
178     char *TEST_GET_LOGMSG(char *msg);
179     char *TEST_GET_LOGMSG2(char *msg);
180     char *TEST_GET_TOP();       //未使用
181     char *TEST_GET_PID(char *pProcName);
182     char *ltrim(char *s);
183     char *rtrim(char *s);
184     char *trim(char *s);
185     char *strim(char *base, char *rmvstr);
186     int TEST_SOCKET_CREATE_THREAD(int port, char pname[]);
187     void *TEST_SOCKET_RUN(void *arg);
188     int TEST_SOCKET_PREPARE_SEND(char msg[]);
189
190 #ifdef __cplusplus
191 }
192 #endif
193
194 /**
195  * End of File. (timeMeasureTool.h)
196  */