クライアント(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と関連する良く見られている質問

Qselect(ソケット)

ソケットを用いてプログラミングしていると、よく出てくると思うのですが、次の意味を教えてください。
select(SH); $| = 1; select(STDOUT);
$|(特殊記号)やSTDOUTなど、なるべる細かく教えて頂けると幸いです。
よろしくお願いします。

Aベストアンサー

ソケットは効率的な処理をするために通常はバッファリングするモードになっています。
(その都度処理するよりある程度やりとりするデータが溜まってまとめてやったほうが効率的)

これを回避(フラッシュ)したいときにselect(SH)のように
ソケットを選んで$|=1 でフラッシュモードに切り替えています。
詳しくないのですがプログラミングにおいてフラッシュが用いられるのは、ソケット通信で双方向にやり取りするときが多いと思います。
ちなみにソケットをclose(SH)すると自動的にフラッシュしてくれます。

また、デフォルトではSTDOUTが選択状態になっていますので
> print "hello.\n";

> print STDOUT "hello.\n";
の省略形というわけです。

余談ですが、Perl使いは面倒くさがりが多いので慣用句みたいに
> select((select(SH),$|=1)[0]);
と、まとめて書く人もいます。
これはselectが返す値が直前まで選択されていたソケットだからできる技です。

ソケットは効率的な処理をするために通常はバッファリングするモードになっています。
(その都度処理するよりある程度やりとりするデータが溜まってまとめてやったほうが効率的)

これを回避(フラッシュ)したいときにselect(SH)のように
ソケットを選んで$|=1 でフラッシュモードに切り替えています。
詳しくないのですがプログラミングにおいてフラッシュが用いられるのは、ソケット通信で双方向にやり取りするときが多いと思います。
ちなみにソケットをclose(SH)すると自動的にフラッシュしてくれま...続きを読む

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

QTCP/IPプログラミングでのselectについて

selectは使用しているソケットのディスクリプタを登録させれば、send、writeシステムコールからのデータの受信等は検知しますよね。
では、コネクション要求(connect)は、検知するのでしょうか?
どなたか回答よろしくお願いします。

Aベストアンサー

もちろん検知しますよ。
LISTENしているソケットに対しての要求を検知したら
acceptしてやればOKです。

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

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

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

Aベストアンサー

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

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

Qselectの意味

selectの意味

リファレンスマニュアルと本のselectの説明がわかりません。
説明の文はなんとかわかるのですが、引数のとり方が「reads[, writes[, excepts[, timeout]]]」となっていて、これは 3 要素の配列を返しているように見えないので、混乱します。「reads[, writes[], excepts[], timeout[]」という書き方なら3 要素の配列を返していると納得できるのですが、ここで返しているのはreadsの中にwritesがあり、更にその中にtimeoutがある配列を返しているんでしょうか?

手元の本に「selectはリクエストを受信すると、リクエストを検出したソケットだけをリストに返します。」とあるのですが、ここで言うソケットとは入力、出力、例外を指していて、リストというのはつまり配列のことなんでしょうか?

Aベストアンサー

a = hoge.select(ARGS)

の場合に、ARGSの部分が引数です。
ここは、「reads[, writes[, excepts[, timeout]]]」とかかれているので
以下の4種類の書き方ができます。
hoge.select(reads, writes, excepts, timeout)
hoge.select(reads, writes, excepts)
hoge.select(reads, writes)
hoge.select(reads)

また、aに代入される値が戻り値です。
ここには、
「戻り値は、timeout した時には nil を、そうでないときは 3 要素の配列を返し、その各要素が入力/出力/例外待ちのオブジェクトの配列です(指定した配列のサブセット)」
と書かれているので
nil 若しくは [???,???,???]の形で値が代入されます。

これでご理解いただけるのではないでしょうか。

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

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

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

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

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

Aベストアンサー

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Qソケットプログラミングで・・

簡単なソケットプログラムを作ろうとしておりまして、サイトで調べたりしておりましたところ、なんとか分かってきたのですが、ひとつどうしてもわからないことがありますので教えていただけますでしょうか。
ソケットから受信するメッセージの生成のところなんですが、
「WSAAsyncSelect(m_socket,m_hWnd,WM_USER_ASYNC_SELECT,FD_READ | FD_WRITE)」
で、2番目の引数「m_hWnd」がわかりません。
教えていただけないでしょうか?よろしくお願いします。

Aベストアンサー

こちらの「III.非同期ソケット通信」のところが参考になりませんか?
WSAAsyncSelect()で、例えば受信データありの場合にイベントとして通知する
ウィンドウのハンドルをここに記述しておき、そのウィンドウのイベント
ハンドラで受信処理を行なうようなプログラミングを可能にします。
http://yonex1.cis.ibaraki.ac.jp/~yonekura/2002kadai/lecture03.html

参考URL:http://yonex1.cis.ibaraki.ac.jp/~yonekura/2002kadai/lecture03.html

QVB2005 Replace 文字の置換え

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

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

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

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

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

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

Aベストアンサー

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

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

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

Qint select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)について

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識だとreadfds,writefdsが引数として与えられているとしても、
どちらかのfd_setのうち、一つでも動きがあればselect文は
抜けてしまうことになります。とすると、戻り値として
「readfds, writefds, exceptfds 中の 1 になっているビットの総数」
は常に1ということになってしまいます。しかし、総数というからには
複数同時に1になることもあるはずです。

私の認識が間違っているとは思うのですが、どう間違っているのかわかりません。
select文の動きについて詳しく教えていただけないでしょうか。
または良いページがあれば教えてください。

見当違いな質問かもしれませんがお願いします。

複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/select.2.html
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きが...続きを読む

Aベストアンサー

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビットが一度にONになっているはずです。
一方、相手が、一切電文を送ってない状態で、selectを呼び出した場合は、何れかのビットがONになればリターンするので、そのときは、貴方が想像しているように
ビットの総数は1になる可能性が高いです。
従って、相手が電文を送る前にselectを呼び出すか、送った後にselectを呼び出すかは、その時のタイミングにより異なります。従って、ビット数の総和が常に1であるとは、考えない方が無難です。(1つのソケットしか使用しない場合は別ですが・・・)

>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。

話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビ...続きを読む

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を見た人がよく見るQ&A

人気Q&Aランキング