質問編集履歴
1
サンプルコードと現状わかっていることを追加しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -112,11 +112,127 @@
|
|
112
112
|
00 00
|
113
113
|
01 01
|
114
114
|
|
115
|
+
④コールバックが入らないPCにおいても、クライアント側からの接続時のコールバックは入る。
|
116
|
+
つまり、サービスコールの機能コード「TFN_TCP_ACP_CEP」のコールバックは入るが、
|
117
|
+
「TFN_TCP_RCV_DAT」のコールバックは入らない。
|
115
118
|
|
116
119
|
### 該当のソースコード
|
117
|
-
サンプルソースコード
|
120
|
+
サンプルソースコードをざっと作ってみました。以下に示します。
|
118
121
|
```C
|
122
|
+
/*
|
123
|
+
* コールバックからの受け渡し情報用グローバル変数
|
124
|
+
*/
|
125
|
+
ID rcvCep; /* 受信CEP格納用 */
|
126
|
+
FN rcvFnCd; /* 受信機能コード格納用 */
|
127
|
+
VP rcvParblk; /* 受信処理結果格納用 */
|
128
|
+
unsigned char rcvBuf[2048]; /* 受信バッファ用 */
|
129
|
+
/*
|
130
|
+
受信する機能コードの種類はマニュアルによると以下の通り
|
131
|
+
|
132
|
+
TFN_TCP_ACP_CEP (-0x205) tcp_acp_cep 完了通知
|
133
|
+
TFN_TCP_CON_CEP (-0x206) tcp_con_cep 完了通知
|
134
|
+
TFN_TCP_CLS_CEP (-0x208) tcp_cls_cep 完了通知
|
135
|
+
TFN_TCP_SND_DAT (-0x209) tcp_snd_dat 完了通知
|
136
|
+
TFN_TCP_RCV_DAT (-0x20a) tcp_rcv_dat 完了通知
|
137
|
+
TFN_TCP_GET_BUF (-0x20b) tcp_get_buf 完了通知
|
138
|
+
TFN_TCP_RCV_BUF (-0x20d) tcp_rcv_buf 完了通知
|
139
|
+
TFN_UDP_SND_DAT (-0x223) udp_snd_dat 完了通知
|
140
|
+
TFN_UDP_RCV_DAT (-0x224) udp_rcv_dat 完了通知
|
141
|
+
*/
|
142
|
+
|
143
|
+
|
144
|
+
/*
|
145
|
+
* メインルーチン
|
146
|
+
*/
|
147
|
+
int mainRoutine(){
|
148
|
+
T_TCP_CREP pk_crep; /* TCP受付口生成情報 */
|
149
|
+
ID repid; /* TCP受付口ID */
|
150
|
+
T_TCP_CCEP pk_ccep; /* TCP通信端点生成情報パケット */
|
151
|
+
ID cepId; /* TCP通信端点ID */
|
152
|
+
T_IPV4EP distAddr; /* 接続受付アドレス情報 */
|
153
|
+
TMO tmout; /* タイムアウト指定 */
|
154
|
+
|
155
|
+
int acpValidFlg = FALSE; //接続有効フラグ
|
156
|
+
|
157
|
+
//
|
158
|
+
//~~~このあたりに変数の初期化処理~~~
|
159
|
+
//
|
160
|
+
|
161
|
+
/* TCP受付口生成呼び出し*/
|
162
|
+
tcp_cre_rep(repid, &pk_crep);
|
163
|
+
|
164
|
+
/* TCP通信端点生成のシステムコール呼び出し */
|
165
|
+
tcp_cre_cep(cepId, &pk_ccep);
|
166
|
+
|
167
|
+
/* リッスン開始 */
|
168
|
+
tcp_acp_cep(cepId, repid, &distAddr, tmout);
|
169
|
+
|
170
|
+
// メインループ
|
171
|
+
while(1){
|
172
|
+
|
173
|
+
//接続有効であればtcp_rcv_dat呼び出してデータ受信をノンブロッキングで呼び出す
|
174
|
+
if(acpValidFlg){
|
175
|
+
tcp_rcv_dat(cepId, rcvBuf, 2048, TMO_NBLK);
|
176
|
+
}
|
177
|
+
|
178
|
+
//コールバックからのイベント通知を待つ(コールバック発生までここでブロッキングのイメージ)
|
179
|
+
waitMsg();
|
180
|
+
|
181
|
+
/* サービスコールの機能コードに応じて分岐 */
|
182
|
+
switch(rcvFnCd)
|
183
|
+
{
|
184
|
+
//接続完了
|
185
|
+
case TFN_TCP_ACP_CEP: //このイベントはNGなPCでもコールバックから拾える
|
186
|
+
//接続完了したら接続有効状態とする
|
187
|
+
acpValidFlg = TRUE;
|
119
|
-
|
188
|
+
break;
|
189
|
+
|
190
|
+
//クローズ完了
|
191
|
+
case TFN_TCP_CLS_CEP:
|
192
|
+
//クローズ完了したら再度リッスン開始
|
193
|
+
acpValidFlg = FALSE; //接続無効にする
|
194
|
+
tcp_acp_cep(cepId, repid, &distAddr, tmout);
|
195
|
+
break;
|
196
|
+
|
197
|
+
//送信完了
|
198
|
+
case TFN_TCP_SND_DAT:
|
199
|
+
//送信完了時の処理省略
|
200
|
+
break;
|
201
|
+
|
202
|
+
//受信完了
|
203
|
+
case TFN_TCP_RCV_DAT: //このイベント、NGなPCではコールバックから拾えない
|
204
|
+
//受信完了時の処理省略
|
205
|
+
break;
|
206
|
+
|
207
|
+
default:
|
208
|
+
break;
|
209
|
+
}
|
210
|
+
}
|
211
|
+
|
212
|
+
return 0;
|
213
|
+
}
|
214
|
+
|
215
|
+
|
216
|
+
/*
|
217
|
+
* Nortiからのコールバック関数
|
218
|
+
*/
|
219
|
+
void callback(ID cepId, FN fnCd, VP parblk)
|
220
|
+
{
|
221
|
+
/* 受信CEPをセット */
|
222
|
+
rcvCep = cepId;
|
223
|
+
|
224
|
+
/* 機能コードを格納 */
|
225
|
+
rcvFnCd = fnCd;
|
226
|
+
|
227
|
+
/* 処理結果を格納 */
|
228
|
+
rcvParblk = parblk;
|
229
|
+
|
230
|
+
/* イベント発生をmainRoutineに通知 */
|
231
|
+
sendMsg();
|
232
|
+
|
233
|
+
return;
|
234
|
+
}
|
235
|
+
|
120
236
|
```
|
121
237
|
|
122
238
|
### 試したこと
|