Japan QualNet Community Forums Japan QualNet Community Forums
Welcome Guest 
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
検索
メインメニュー
アクセスカウンター
2024/05/17:14/17
2024/05/16:22/24

2024/03/18より397/1407
人気モジュール
No.1: フォーラム 100
No.2: QualNet概要 3
No.3: ニュース 2
日曜日からの合計
人気Browser&OS
No.1:巡回ロボット80
No.2:Unknown OS1
No.3:Windows XP1

No.1:どっかの巡回ロボット71
No.2:Majestic-12巡回ロボット6
No.3:Google巡回ロボット3

日曜日からの合計
メイン
   Application Layer Protocol Implementation & Model Development
     サーバ側の複数パケット返答について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
qulneko
投稿日時: 2007/1/15 18:21
新米
登録日: 2006/10/13
居住地:
投稿: 8
サーバ側の複数パケット返答について
いつもお世話になっています。
現在、lookupアプリケーションと同様にクライアント側がパケットを送信し、それを受信したサーバはクライアント側にリプライパケットを送信するという形を実装しました。
そこで、次に、クライアント側からのパケットを受信したサーバが複数のリプライパケットをクライアント側に送信するというのを実装しようと試みたのですが、エラーがでて上手くいきません。。

現在の方法としては、
クライアント側が「APP_UdpSendNewHeaderData」でサーバ側にパケットを送信。そのパケットをサーバ側が受信すると(「MSG_APP_FromTransport」)
サーバは「APP_UdpSendNewHeaderVirtualDataWithPriority」を使ってクライアントに向けパケットを送信する。
(この1回だけの動作だと、サーバはクライアントに向けユニキャストでパケットを送信してくれるのですが…)

「APP_UdpSendNewHeaderVirtualDataWithPriority」を実行した後、lookupアプリケーションやCBRアプリケーションのクライアント側の動作同様に「AppLookupServerScheduleNextPkt()」なるタイマー関数をつくり
(※timerMsg = MESSAGE_Alloc(
node,
APP_LAYER,
APP_LOOKUP_SERVER,
MSG_APP_FromTransport);
↑AppLookupServerScheduleNextPktの一部)

サーバ側の「MSG_APP_FromTransport」を呼び出して、「APP_UdpSendNewHeaderVirtualDataWithPriority」を再度呼び出すことで複数回パケットを送信しようと試みましたがエラーがでてします。。

ちなみになぜ、複数回パケットを受信側が送信側に送信したいかというと、クライアントがコンテンツを要求→要求パケットを受け取ったサーバがコンテンツを返答、という流れを実装したいためで、サーバ側1回の返答だけでは到底byte数が足りない為です

長々、書き込んでわかりにくくなってしまいましたが何か解決策がわかる方ご教授いただけないでしょうか。
よろしくお願いします。



kabocha
投稿日時: 2007/1/15 19:24
常連
登録日: 2006/9/8
居住地:
投稿: 43
Re: サーバ側の複数パケット返答について
エラーがでるっておっしゃっていますが、コンパイルエラー? のことですか?

とりあえず、まずいと思うのは、 ここかなぁ。


timerMsg = MESSAGE_Alloc(
                         node,
                         APP_LAYER,
                         APP_LOOKUP_SERVER,
                         MSG_APP_FromTransport);


これでタイマーを仕掛けることは出来るでしょうが、イベントディスパッチ処理で、ディスパッチされた message ポインタが、packet なのか、イベントなのかが分からないと思います。

上記のタイマーを仕掛けて、以下のディスパッチ処理をハンドラ関数に入れておけば、確かに MSG_APP_FromTansport に処理が行われることになると思います。


switch (msg->eventType)
{
     case MSG_APP_FromTransport:


しかし、 lookup server では、 この msg は イコール packet ですが、qualneko さんのインプリメントでは、このmsg は timerMsg であって、パケットではありません。当然 case MSG_APP_FromTransport 内の処理も変わるはずです。それを考慮していないとすれば、アクセス違反かなにかで、落っこちる結果になるだけだと思います。



timerMsg = MESSAGE_Alloc(node,
                               APP_LAYER,
                               APP_LOOKUP_SERVER,
                               MSG_APP_TimerExpired);


のようにきちんとタイマーイベントを作成してタイマーをスケジュールし、ディスパッチ関数を以下のように書いてあげる必要があるのではないでしょうか?


     switch (msg->eventType)
     {
         case MSG_APP_TimerExpired:
         {
             AppTimer *timer;
 
             timer = (AppTimer *) MESSAGE_ReturnInfo(msg);
 
             switch (timer->type)
             {
                 case APP_TIMER_SEND_PKT:
                 クライアントへの送信


これ以上のことは文章からはなんとも・・・
qulneko
投稿日時: 2007/1/17 23:57
新米
登録日: 2006/10/13
居住地:
投稿: 8
Re: サーバ側の複数パケット返答について
kabochaさん、早速のご返答ありがとうございます。
ほんと、読みにくい文章ですいませんでした。

エラーとはコンパイルエラーではなく、シミュレーション中に強制的に止まってしまうものです。



timerMsg = MESSAGE_Alloc(node,
                               APP_LAYER,
                               APP_LOOKUP_SERVER,
                               MSG_APP_TimerExpired);



でタイマースケジュールを実装して、



switch (msg->eventType)
     {
         case MSG_APP_TimerExpired:
         {
             AppTimer *timer;
 
             timer = (AppTimer *) MESSAGE_ReturnInfo(msg);
 
             switch (timer->type)
             {
                 case APP_TIMER_SEND_PKT:
                 クライアントへの送信



と言う形でもういちど頑張ってみようと思います。
kabocha さんありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT