OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

Socket通信で、通信終了のイベントが発生しない

  • すぐに回答を!
  • 質問No.227737
  • 閲覧数495
  • ありがとう数3
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 66% (82/123)

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

質問者が選んだベストアンサー

  • 回答No.4
レベル12

ベストアンサー率 65% (276/422)

なるほどー
うーむ難しいですねー

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

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

すいません。かなり推測でお話をさせていただいてます。_(._.)_
補足コメント
lily02

お礼率 66% (82/123)

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

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

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

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

お礼率 66% (82/123)

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

その他の回答 (全3件)

  • 回答No.1
レベル10

ベストアンサー率 31% (47/149)

もう解決されたかもしれませんが。 >その間は送信終了のイベントが発生しません。 クライアントで、SendCompleteイベントが発生しないということですか? 解決方法として、サーバから応答電文をクライアントに送信するという ことではどうですか?それくらい考えたわいと怒られそうですが。 ...続きを読む
もう解決されたかもしれませんが。

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

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

お礼率 66% (82/123)

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

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

お返事がいただけて嬉しかったです。もう少しいろいろ試してみます。
投稿日時 - 2002-03-07 10:31:33
  • 回答No.2
レベル10

ベストアンサー率 31% (47/149)

>信終了のイベントが発生しないというのは、 >Closeイベントが発生しないということです。 どうもWindowsとUnix間通信ではWinSockのCloseイベントは 発生しないようです。 以下のURLの「コラム:WinSock」でも見てください。 ...続きを読む
>信終了のイベントが発生しないというのは、
>Closeイベントが発生しないということです。

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

以下のURLの「コラム:WinSock」でも見てください。
補足コメント
lily02

お礼率 66% (82/123)

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

お礼率 66% (82/123)

いろいろとありがとうございました。
まだ解決していませんが、データ送信後のホスト側での処理をリモートシェルで行う方法を検討しています。アクセス権の問題など別の問題が発生していますが何とか格闘してみます。
投稿日時 - 2002-03-17 10:33:55
  • 回答No.3
レベル12

ベストアンサー率 65% (276/422)

UNIXについては、最低限の知識しかありません。 ですのでよくわかってないのですが。。。 送信は新たなソケットを作成して行ってますよね? そうすると通常はWinSock1_Closeイベントが発生するように思えるのですが・・・ UNIXで受け専用のロジックでもあるのですか? ...続きを読む
UNIXについては、最低限の知識しかありません。

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

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

UNIXで受け専用のロジックでもあるのですか?
補足コメント
lily02

お礼率 66% (82/123)

サーバ側(UNIX)では常時ソケットは接続要求を待っています(listen)。クライアント側が接続要求すると受け入れOKなら接続番号を返し(accept)、通信が始まります。通信が完了するとクライアント側が切断要求をだすことにより、サーバ側がこの接続番号のソケットを閉じます。(close)
そのあとクライアント側でWinSock1_Closeイベントが発生します。
データのやり取りだけならこれで問題ないのですが、サーバ側で受信したデータを解析処理したり色々な仕事を非同期で実行しています。だから問題ないはずなのですが、なぜか非同期で実行している仕事が終わるまで、クライアント側のWinSock1_Closeイベントが発生しません。サーバ側のCloseを発行している時刻を調べると受信が終わってすぐ発行しているので、クライアント側ですぐに終われるはずなので、何かWinSockの設定の問題なのか、サーバとクライアントのどちらに問題があるのか、手がかりが見つかりません。途方にくれています。
投稿日時 - 2002-03-08 20:54:34
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ