- ベストアンサー
Socket通信で、通信終了のイベントが発生しない
クライアント(Windows)とサーバ(Unix)とSocket通信をするアプリを作っています。処理内容はクライアントのデータファイルをサーバに送信(アップデイト)し、サーバ側でデータを解析し、その結果を印刷するという手順です。 WinSockを使って、送信そのものはうまくいくのですが、サーバでデータを解析し結果を印刷するのに時間がかかり(10秒以上)、その間は送信終了のイベントが発生しません。これはサーバ側での処理を exec関数とwait関数で行っているので、正しい事態なのですが、データの送信が終わったら後はサーバ側で勝手にやって欲しいのです。サーバでの処理を system関数に置換えたり、バックグランド処理にしてもやはり処理が終わるまで送信終了のイベントが発生しません。何かいい方法をお教えください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
なるほどー うーむ難しいですねー Winsock1.SendData HogeHoge DoEvents とすると、どうですか? またはサーバーが解析処理に入る前に、DoEventsみたいなものをUNIX側で実行することは無理ですか? 非同期で実行はしているけど、その解析処理が占有しているために、クライアントに届かないなんてことは無いですか? すいません。かなり推測でお話をさせていただいてます。_(._.)_
その他の回答 (3)
- TAGOSAKU7
- ベストアンサー率65% (276/422)
UNIXについては、最低限の知識しかありません。 ですのでよくわかってないのですが。。。 送信は新たなソケットを作成して行ってますよね? そうすると通常はWinSock1_Closeイベントが発生するように思えるのですが・・・ UNIXで受け専用のロジックでもあるのですか?
補足
サーバ側(UNIX)では常時ソケットは接続要求を待っています(listen)。クライアント側が接続要求すると受け入れOKなら接続番号を返し(accept)、通信が始まります。通信が完了するとクライアント側が切断要求をだすことにより、サーバ側がこの接続番号のソケットを閉じます。(close) そのあとクライアント側でWinSock1_Closeイベントが発生します。 データのやり取りだけならこれで問題ないのですが、サーバ側で受信したデータを解析処理したり色々な仕事を非同期で実行しています。だから問題ないはずなのですが、なぜか非同期で実行している仕事が終わるまで、クライアント側のWinSock1_Closeイベントが発生しません。サーバ側のCloseを発行している時刻を調べると受信が終わってすぐ発行しているので、クライアント側ですぐに終われるはずなので、何かWinSockの設定の問題なのか、サーバとクライアントのどちらに問題があるのか、手がかりが見つかりません。途方にくれています。
- zerosix
- ベストアンサー率31% (47/149)
>信終了のイベントが発生しないというのは、 >Closeイベントが発生しないということです。 どうもWindowsとUnix間通信ではWinSockのCloseイベントは 発生しないようです。 以下のURLの「コラム:WinSock」でも見てください。
お礼
いろいろとありがとうございました。 まだ解決していませんが、データ送信後のホスト側での処理をリモートシェルで行う方法を検討しています。アクセス権の問題など別の問題が発生していますが何とか格闘してみます。
補足
ありがとうございます。 サーバでの処理が終われば Close イベントは発生しているので、問題の多くはサーバ側の処理にあるのだと思います。 「コラム:WinSock」参考にさせていただきます。 これから仕事先に行って試行錯誤をしてみます。
- zerosix
- ベストアンサー率31% (47/149)
もう解決されたかもしれませんが。 >その間は送信終了のイベントが発生しません。 クライアントで、SendCompleteイベントが発生しないということですか? 解決方法として、サーバから応答電文をクライアントに送信するという ことではどうですか?それくらい考えたわいと怒られそうですが。
補足
いいえ、解決していません。 送信終了のイベントが発生しないというのは、 Closeイベントが発生しないということです。 もともとこのアプリは、クライアント(Ms-dos)サーバ(Unix)でやりとりしていたのをクライアント側だけWindows用に作り変えています。socket通信のサーバ側のソフトはそのまま利用していて、独自のプロトコル(データのやりとりの手順が決まっているので)でやりとりしている中でサーバ側のCloseはデータ受信後すぐ発行されているのですが、exec関数で実行している処理が終了するまで待っている感じです。 お返事がいただけて嬉しかったです。もう少しいろいろ試してみます。
お礼
いろいろとありがとうございました。 まだ解決していませんが、データ送信後のホスト側での処理をリモートシェルで行う方法を検討しています。アクセス権の問題など別の問題が発生していますが何とか格闘してみます。
補足
いろいろと一緒に考えてくださってありがとうございます。 サーバ側ではデータの受信後ソケットを閉じているのでそれ以外の処理は思いつきません。それにクライアント側がMS-DOSで作ったアプリは現在運用中ですが、データ送信後すぐに終了しているので、やはりクライアント側の問題かなと思ったり。 それで、 Winsock1.SendData HogeHoge DoEvents の、HogeHoge って何ですか? サーバ側がcloseしてから送信することになるとエラーになると思いますが、 サーバの状況をチェックするために何か送信するのはいいテストだと思います。 クライアント側で、自主的にWinSock1_Close を発行するのは、サーバ側で処理が正常に行われず失敗しました。 でもクライアント側で何かアクションする方向をまだ模索してみたいと思います。