質問編集履歴

1

サンプルコードと現状わかっていることを追加しました。

2022/07/01 05:14

投稿

eleele28
eleele28

スコア18

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
  ### 試したこと