クライアント(Windows)とサーバ(Unix)とSocket通信をするアプリを作っています。処理内容はクライアントのデータファイルをサーバに送信(アップデイト)し、サーバ側でデータを解析し、その結果を印刷するという手順です。
WinSockを使って、送信そのものはうまくいくのですが、サーバでデータを解析し結果を印刷するのに時間がかかり(10秒以上)、その間は送信終了のイベントが発生しません。これはサーバ側での処理を exec関数とwait関数で行っているので、正しい事態なのですが、データの送信が終わったら後はサーバ側で勝手にやって欲しいのです。サーバでの処理を system関数に置換えたり、バックグランド処理にしてもやはり処理が終わるまで送信終了のイベントが発生しません。何かいい方法をお教えください。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

なるほどー


うーむ難しいですねー

Winsock1.SendData HogeHoge
DoEvents
とすると、どうですか?

またはサーバーが解析処理に入る前に、DoEventsみたいなものをUNIX側で実行することは無理ですか?
非同期で実行はしているけど、その解析処理が占有しているために、クライアントに届かないなんてことは無いですか?

すいません。かなり推測でお話をさせていただいてます。_(._.)_

この回答への補足

いろいろと一緒に考えてくださってありがとうございます。

サーバ側ではデータの受信後ソケットを閉じているのでそれ以外の処理は思いつきません。それにクライアント側がMS-DOSで作ったアプリは現在運用中ですが、データ送信後すぐに終了しているので、やはりクライアント側の問題かなと思ったり。

それで、
Winsock1.SendData HogeHoge
DoEvents
の、HogeHoge って何ですか?

サーバ側がcloseしてから送信することになるとエラーになると思いますが、
サーバの状況をチェックするために何か送信するのはいいテストだと思います。
クライアント側で、自主的にWinSock1_Close を発行するのは、サーバ側で処理が正常に行われず失敗しました。
でもクライアント側で何かアクションする方向をまだ模索してみたいと思います。

補足日時:2002/03/09 00:54
    • good
    • 0
この回答へのお礼

いろいろとありがとうございました。
まだ解決していませんが、データ送信後のホスト側での処理をリモートシェルで行う方法を検討しています。アクセス権の問題など別の問題が発生していますが何とか格闘してみます。

お礼日時:2002/03/17 10:33

UNIXについては、最低限の知識しかありません。



ですのでよくわかってないのですが。。。

送信は新たなソケットを作成して行ってますよね?
そうすると通常はWinSock1_Closeイベントが発生するように思えるのですが・・・

UNIXで受け専用のロジックでもあるのですか?

この回答への補足

サーバ側(UNIX)では常時ソケットは接続要求を待っています(listen)。クライアント側が接続要求すると受け入れOKなら接続番号を返し(accept)、通信が始まります。通信が完了するとクライアント側が切断要求をだすことにより、サーバ側がこの接続番号のソケットを閉じます。(close)
そのあとクライアント側でWinSock1_Closeイベントが発生します。
データのやり取りだけならこれで問題ないのですが、サーバ側で受信したデータを解析処理したり色々な仕事を非同期で実行しています。だから問題ないはずなのですが、なぜか非同期で実行している仕事が終わるまで、クライアント側のWinSock1_Closeイベントが発生しません。サーバ側のCloseを発行している時刻を調べると受信が終わってすぐ発行しているので、クライアント側ですぐに終われるはずなので、何かWinSockの設定の問題なのか、サーバとクライアントのどちらに問題があるのか、手がかりが見つかりません。途方にくれています。

補足日時:2002/03/08 20:54
    • good
    • 0

>信終了のイベントが発生しないというのは、


>Closeイベントが発生しないということです。

どうもWindowsとUnix間通信ではWinSockのCloseイベントは
発生しないようです。

以下のURLの「コラム:WinSock」でも見てください。

参考URL:http://research.nii.ac.jp/~ichiro/lecture/syspro …

この回答への補足

ありがとうございます。
サーバでの処理が終われば Close イベントは発生しているので、問題の多くはサーバ側の処理にあるのだと思います。
「コラム:WinSock」参考にさせていただきます。
これから仕事先に行って試行錯誤をしてみます。

補足日時:2002/03/07 12:37
    • good
    • 0
この回答へのお礼

いろいろとありがとうございました。
まだ解決していませんが、データ送信後のホスト側での処理をリモートシェルで行う方法を検討しています。アクセス権の問題など別の問題が発生していますが何とか格闘してみます。

お礼日時:2002/03/17 10:33

もう解決されたかもしれませんが。



>その間は送信終了のイベントが発生しません。
クライアントで、SendCompleteイベントが発生しないということですか?

解決方法として、サーバから応答電文をクライアントに送信するという
ことではどうですか?それくらい考えたわいと怒られそうですが。

この回答への補足

いいえ、解決していません。
送信終了のイベントが発生しないというのは、
Closeイベントが発生しないということです。

もともとこのアプリは、クライアント(Ms-dos)サーバ(Unix)でやりとりしていたのをクライアント側だけWindows用に作り変えています。socket通信のサーバ側のソフトはそのまま利用していて、独自のプロトコル(データのやりとりの手順が決まっているので)でやりとりしている中でサーバ側のCloseはデータ受信後すぐ発行されているのですが、exec関数で実行している処理が終了するまで待っている感じです。

お返事がいただけて嬉しかったです。もう少しいろいろ試してみます。

補足日時:2002/03/07 10:31
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q.NET Frameworkでサーバ側の処理

最近、マイクロソフトの.NET Frameworkを利用した、
リッチクライアントの実現(スマートクライアント)
についてよく耳にするのですが、いまいちイメージがつかめないので質問させていただきます。

サーバ側にはビジネスロジックのみを実装し、
クライアント側ではユーザーインターフェイスのロジックのみを実装させることで、更新処理を効率化できるとあるのですが、

・サーバ側で実装するビジネスロジックは、.NETの言語の で記述できるのですか?
・またクライアントから、どのようにしてサーバー側の
 ロジックを呼び出すのでしょうか?

全くの初心者質問であるのですが、
なにか情報をお持ちでしたら
ぜひ教えていただければと思います。
よろしくお願い致します。

Aベストアンサー

> ・サーバ側で実装するビジネスロジックは、.NETの言語の で記述できるのですか?

.NETの言語でADO.NETを操る。

>・またクライアントから、どのようにしてサーバー側の
> ロジックを呼び出すのでしょうか?

普通はXML Webサービス

サーバ側

Webサービス(サーバ) + ADO.NET

クライアント側

GUI + Webサービス(クラアント)

参考URL:http://www.atmarkit.co.jp/fdotnet/special/smartstrtg/smartstrtg_02.html

Qイベントの発生から対応する処理実行までの作り方

以前に、ボタンクリックなどのイベントが起きたら
すぐにそのボタンクリックに対応した処理をその場(イベント
ハンドラ)で実行するのではなく、
"イベントが発生しました関数"のようなものに最初に
イベント情報を渡してしまい、あとはその関数からイベントが
振り分けられていき、最終的にそのイベントに対応した処理が
実行される。といったプログラムを見たことがあるのですが、
このような技法は一般的に行われるものなのでしょうか?
巨大なプログラムになるとこのような技法が使われる気が
しますが・・・

また、この技法には何か名前がついているのでしょうか?
また、これに関して記載しているサイト・書籍などありましたら
教えてください。

Aベストアンサー

名前についてはわかりませんが、
 メニューから
 ツールバーから
 ショートカットキーから
 外部プログラムの操作から
 起動時引数から
 マクロから
同じ機能を呼び出す場合などに使うことがあるかもしれません。

私の場合はすべての操作を一つの関数にまとめるよりは、機能ごとに関数(クラスのメソッド)を作るやり方の方が好みです。

QVBAでデータ処理。データを処理し合計をするには

データは外注、外注個別工事別、顧客、月、に分けてあります。最終的に月別の合計を出すのですがその月別のデータは以下の通りに集計します。

         │ 横 顧客別
--------------- │----------
縦 外注工事別 │ 合計
  │

データには番号が振ってあります。

1 外注A 顧客 月 外注工事別 金額
というのがデータの種類です。ここで言う工事別というのは外注Aに対して工事が2種類以上ある場合があるためです。
VBAでしか出来ないと言われたのですが、私はマクロ記録程度しかできませんので、どなたか教えていただけると嬉しいです。

Aベストアンサー

No.1です。
参考になられたようで、よかったですね。

私の提示した市販ソフト例はあくまでも一例です。
ほかにもいろいろあると思いますので、検索サイトで業界用語でも
入れて探してみてください。

然るに。
業務と言いますのは、自分がOnly Oneの業界でもない限りは、
かならず「他の誰かも既にやっています」。
ということは、答えはすぐそこに転がっているんですね。

業務用パッケージの購入は、筆まめや何やのソフトのように、
一時的な負担は大きく見えますが、Windowsがバージョンが幾つに
上がっても、メーカさえ生き残ればソフトは常に互換性ありで
バージョンアップし続けて行きます。

昔のシステムは全部手組でしたが。
今は、いろいろ購入しての組み合わせが一番です。

例えば夕食を作る時も、冷凍食品や、お惣菜を使ったほうが
スピーディで、味は…無難に。しかし速いです。
ソフトにもそれが言えます。

ま、ただし。
一方ではお悩みになり、「Excelでどないしようか?」ウンウン
考えることは無駄ではありません。

全くソフトを知らないよりは、ご自身で努力なされて勉強されますと。
ソフトの仕組み、苦労が判り、ご自身の業務の複雑さが、改善すべき
非効率さが、難しい=お金がかかるという構図が見えるように
なります。
実際に、我々もお客様を相手していて、ITを全く知らないお客様より
自身で努力されたお客様のほうが、低コストでとてもうまくいく
傾向にあります。
そういうお客様であればある程、お客様自身が、いろいろ試行錯誤
した利用の仕方をされているケースもあり。
我々自身が作った自社ソフトを「こんな使い方もあるのか!?」と、
逆に教えられ、大変勉強になったりしています。

いろいろ苦労はなされると思いますが。
今回の一件も無駄ではないかと。

今後とも頑張ってくださいね。
以上、ありがとうございました。

No.1です。
参考になられたようで、よかったですね。

私の提示した市販ソフト例はあくまでも一例です。
ほかにもいろいろあると思いますので、検索サイトで業界用語でも
入れて探してみてください。

然るに。
業務と言いますのは、自分がOnly Oneの業界でもない限りは、
かならず「他の誰かも既にやっています」。
ということは、答えはすぐそこに転がっているんですね。

業務用パッケージの購入は、筆まめや何やのソフトのように、
一時的な負担は大きく見えますが、Windowsがバージョンが幾つに...続きを読む

QVB2005 Replace 文字の置換え

逆引き大全500の「183 文字列の中の指定した文字を別の文字に置き換える」の項なのですが・・・
ご存知の方がいらっしゃいましたらよろしくお願い致します。

TextBox1 に「今日は本当に天気が良くて」と入力し、
ボタンを押すと「本当」という漢字を「ホント」というカタカナに
置き換えて Label1 に表示するコードなのですが

Dim Text1 As String = TextBox1.Text
Label1.Text = Text1.Replace("本当","ホント")

という記述になっています。

これで実際に動いたのですが、この記述だと、一文字だけしか置換えできません。
ですが、「本当」だけではなく、「天気」という漢字も「テンキ」というカタカナに置き換えたいのです。

テキストボックスに表示された
「今日は本当に天気が良くて」を一度に
「今日はホントにテンキが良くて」と置き換える方法は
ありますでしょうか?よろしくお願い致します。

Aベストアンサー

複数置き換えするのなら、置き換え対文字列を配列などに格納
して、Replaceを複数回行えばいいでしょう。

Text1.Text = Text1.Text.Replace("本当", "ホント").Replace("天気", "テンキ")

これでも、目的は達成できますが・・・

QListViewで、PageDownキーイベントを発生させるには?

VB6で開発しています。

ラベルとListViewのみのフォーム上で、
PageUpやPageDownキー押下で、イベントを発生させたいのですが、
PageDownを押下すると、ListView内のリストのカーソルが下に移動してしまい、
(フォーカスが当たるコントロールがListViewしかないためと思われますが)
イベントが発生せずに困っています。

自分で実現しようとしてできなかった方法を紹介します
・リストビューにフォーカスが当たらないようにする。
  Enabled = Falseだとスクロールバーが使えないので困る。
  
・ListViewはEnabled=Falseにし、スクロールバーコントロールを使って、スクロールさせる。
  スクロールさせる方法が見つかりませんでした。

何か、よいアイデアや方法があれば、ご教授宜しくお願いしますm(_ _)m

Aベストアンサー

VB6の標準コントロールの場合は FormのKeyPreviewをTrueにすることでコントロールより先にForm側でKeyPress/KeyDown/KeyUpで処理可能なようです
しかしListViewやTreeViewの場合同様の設定を施しても ListView側がキーイベントを処理してしまうようです

方法としては ListViewコントロールをサブクラス化してサブクラス化したListViewのWndProcのなかで WM_KEYDOWNなどのメッセージを親に通知する仕組みを構築する必要がありそうです


人気Q&Aランキング

おすすめ情報