クライアント(Windows)とサーバ(Unix)とSocket通信をするアプリを作っています。処理内容はクライアントのデータファイルをサーバに送信(アップデイト)し、サーバ側でデータを解析し、その結果を印刷するという手順です。
WinSockを使って、送信そのものはうまくいくのですが、サーバでデータを解析し結果を印刷するのに時間がかかり(10秒以上)、その間は送信終了のイベントが発生しません。これはサーバ側での処理を exec関数とwait関数で行っているので、正しい事態なのですが、データの送信が終わったら後はサーバ側で勝手にやって欲しいのです。サーバでの処理を system関数に置換えたり、バックグランド処理にしてもやはり処理が終わるまで送信終了のイベントが発生しません。何かいい方法をお教えください。
No.4ベストアンサー
- 回答日時:
なるほどー
うーむ難しいですねー
Winsock1.SendData HogeHoge
DoEvents
とすると、どうですか?
またはサーバーが解析処理に入る前に、DoEventsみたいなものをUNIX側で実行することは無理ですか?
非同期で実行はしているけど、その解析処理が占有しているために、クライアントに届かないなんてことは無いですか?
すいません。かなり推測でお話をさせていただいてます。_(._.)_
この回答への補足
いろいろと一緒に考えてくださってありがとうございます。
サーバ側ではデータの受信後ソケットを閉じているのでそれ以外の処理は思いつきません。それにクライアント側がMS-DOSで作ったアプリは現在運用中ですが、データ送信後すぐに終了しているので、やはりクライアント側の問題かなと思ったり。
それで、
Winsock1.SendData HogeHoge
DoEvents
の、HogeHoge って何ですか?
サーバ側がcloseしてから送信することになるとエラーになると思いますが、
サーバの状況をチェックするために何か送信するのはいいテストだと思います。
クライアント側で、自主的にWinSock1_Close を発行するのは、サーバ側で処理が正常に行われず失敗しました。
でもクライアント側で何かアクションする方向をまだ模索してみたいと思います。
いろいろとありがとうございました。
まだ解決していませんが、データ送信後のホスト側での処理をリモートシェルで行う方法を検討しています。アクセス権の問題など別の問題が発生していますが何とか格闘してみます。
No.3
- 回答日時:
UNIXについては、最低限の知識しかありません。
ですのでよくわかってないのですが。。。
送信は新たなソケットを作成して行ってますよね?
そうすると通常はWinSock1_Closeイベントが発生するように思えるのですが・・・
UNIXで受け専用のロジックでもあるのですか?
この回答への補足
サーバ側(UNIX)では常時ソケットは接続要求を待っています(listen)。クライアント側が接続要求すると受け入れOKなら接続番号を返し(accept)、通信が始まります。通信が完了するとクライアント側が切断要求をだすことにより、サーバ側がこの接続番号のソケットを閉じます。(close)
そのあとクライアント側でWinSock1_Closeイベントが発生します。
データのやり取りだけならこれで問題ないのですが、サーバ側で受信したデータを解析処理したり色々な仕事を非同期で実行しています。だから問題ないはずなのですが、なぜか非同期で実行している仕事が終わるまで、クライアント側のWinSock1_Closeイベントが発生しません。サーバ側のCloseを発行している時刻を調べると受信が終わってすぐ発行しているので、クライアント側ですぐに終われるはずなので、何かWinSockの設定の問題なのか、サーバとクライアントのどちらに問題があるのか、手がかりが見つかりません。途方にくれています。
No.2
- 回答日時:
>信終了のイベントが発生しないというのは、
>Closeイベントが発生しないということです。
どうもWindowsとUnix間通信ではWinSockのCloseイベントは
発生しないようです。
以下のURLの「コラム:WinSock」でも見てください。
参考URL:http://research.nii.ac.jp/~ichiro/lecture/syspro …
この回答への補足
ありがとうございます。
サーバでの処理が終われば Close イベントは発生しているので、問題の多くはサーバ側の処理にあるのだと思います。
「コラム:WinSock」参考にさせていただきます。
これから仕事先に行って試行錯誤をしてみます。
いろいろとありがとうございました。
まだ解決していませんが、データ送信後のホスト側での処理をリモートシェルで行う方法を検討しています。アクセス権の問題など別の問題が発生していますが何とか格闘してみます。
No.1
- 回答日時:
もう解決されたかもしれませんが。
>その間は送信終了のイベントが発生しません。
クライアントで、SendCompleteイベントが発生しないということですか?
解決方法として、サーバから応答電文をクライアントに送信するという
ことではどうですか?それくらい考えたわいと怒られそうですが。
この回答への補足
いいえ、解決していません。
送信終了のイベントが発生しないというのは、
Closeイベントが発生しないということです。
もともとこのアプリは、クライアント(Ms-dos)サーバ(Unix)でやりとりしていたのをクライアント側だけWindows用に作り変えています。socket通信のサーバ側のソフトはそのまま利用していて、独自のプロトコル(データのやりとりの手順が決まっているので)でやりとりしている中でサーバ側のCloseはデータ受信後すぐ発行されているのですが、exec関数で実行している処理が終了するまで待っている感じです。
お返事がいただけて嬉しかったです。もう少しいろいろ試してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CGI(Perl)のメッセージボックス...
-
ハウスキープ処理について
-
JSPでのリアルタイムな時刻表示
-
「<c:forEach タグが終了し...
-
三菱GOTの画面切り替えについて
-
腕時計の時報をならないように...
-
リクエストに応じたselectedの...
-
ボタンが活性化の場合とは、ボ...
-
フォルダ改行
-
非アクティブな画面を操作する...
-
漏電遮断器の黄色ボタンと白色...
-
このadidasの腕時計の時刻の設...
-
int型の内容をbyteの配列にコピー
-
dbからデータをとりだす際、sql...
-
jspからServletを呼び、元のjsp...
-
FormのsubmitでFormの内容がnull
-
Javaプログラミングの質問にな...
-
JSPからJSPへ情報を渡せる?
-
セッション切れでのリクエスト...
-
location.hrefでページ切替時の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
NetworkStreamからのRead()で、...
-
CGI(Perl)のメッセージボックス...
-
CPUを2つ搭載するといいのです...
-
サーバ上でアプリケーションを...
-
ASPとCGIの違い
-
ハウスキープ処理について
-
サーバー内でPDF自動生成したい...
-
ネット上でのリアルタイム通信...
-
ASP.NET値の受け渡し
-
<%@ language="VBScript" %>
-
データベースをJavaScriptで処...
-
JSPでのリアルタイムな時刻表示
-
CSocket通信での待機処理について
-
株価や為替レートのリアルタイ...
-
Perlで処理の進行状況をユ...
-
VC++のHTTP通信
-
一定時間でPostBackさせたい(A...
-
ASP.NET MVCのAjaxフォーム検証
-
入力フォームの入力チェックに...
-
PHPとHTMLとCSSの関係性について
おすすめ情報