最新閲覧日:

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

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が見つからない時は、教えて!gooで質問しましょう!

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

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


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ