• ベストアンサー

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

TAGOSAKU7の回答

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

なるほどー うーむ難しいですねー Winsock1.SendData HogeHoge DoEvents とすると、どうですか? またはサーバーが解析処理に入る前に、DoEventsみたいなものをUNIX側で実行することは無理ですか? 非同期で実行はしているけど、その解析処理が占有しているために、クライアントに届かないなんてことは無いですか? すいません。かなり推測でお話をさせていただいてます。_(._.)_

lily02
質問者

お礼

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

lily02
質問者

補足

いろいろと一緒に考えてくださってありがとうございます。 サーバ側ではデータの受信後ソケットを閉じているのでそれ以外の処理は思いつきません。それにクライアント側がMS-DOSで作ったアプリは現在運用中ですが、データ送信後すぐに終了しているので、やはりクライアント側の問題かなと思ったり。 それで、 Winsock1.SendData HogeHoge DoEvents の、HogeHoge って何ですか? サーバ側がcloseしてから送信することになるとエラーになると思いますが、 サーバの状況をチェックするために何か送信するのはいいテストだと思います。 クライアント側で、自主的にWinSock1_Close を発行するのは、サーバ側で処理が正常に行われず失敗しました。 でもクライアント側で何かアクションする方向をまだ模索してみたいと思います。

関連するQ&A

  • ジョブの切り離し

    クライアント(Windows)とサーバ(Unix)の通信アプリを作っています。 ソケットプログラムはクライアント側はVBで、サーバ側はCです。 データの送受信はうまくいきました。ところが、データを送信後サーバ側でデータを解析し、その結果を印刷するというしくみなのですがこの全処理が終わらないとクライアント側に送信終了のイベントが発生しません。 クライアント側がデータを送信したら、あとはサーバ側で処理をする、というふうにしたいのです。 そこでサーバ側のアプリは次のような構造になっています。 App1(ソケットアプリ) exec でApp2 を起動 App2(データの送受信) wait あり exec でApp3 を起動 App3(データ解析)              wait なし exec でApp4,App5 を起動 wait あり、sleep あり App3以降で時間がとてもかかります。wait,sleep が入っているからですが、これはデータ解析する上で必要な手順です。データの送受信はApp2までで終わっているので、App3のプロセスを発行したらソケット切断にしたいのですが、App3が全て終わるまで待ってしまいます。 起動のさせ方でなんとかならないものかと思うのですが、どうぞアドバイスを宜しくお願いいたします。

  • TextChangeイベントが発生しない

    ASP.NETで開発を行っています。 クライアント側の処理はJavaScript、サーバー側の処理は VB.NETを使っています。 サーバー側であるテキストボックスに対してT extChangeイベントを発生させたいのですが、 クライアント側の処理で値を入力したときは、 イベントが発生しません。 サーバー側で値を変更したときは発生します。 具体的な手順は以下のとおりです。 Cookieから取得した値をテキストボックスにセット ↓ この時点でTextChangeイベントを発生させたいが、何も起こらない。 ↓ サーバー側の処理でそのテキストボックスの値を変更する。 ↓ この時点でTextChangeイベントが発生。 また画面上で直接値を入力したときはイベントが発生します。 クライアント側の処理でテキストボックスに入力した場合は、 サーバー側のイベントは発生しないのでしょうか。 この処理の中で値が入力された時点でイベントを発生させる にはどうしたらいいのでしょうか?

  • ソケットプログラミングのrecv時にFD_READイベントが終わらない

    現在Winsockを用いているのですが、クライアントからのデータを受信したときにおこるFD_READイベントをWSAWaitForMultipleEventで受け取って処理しているのですが、recvからの戻り値が常に0にも関わらずFD_READイベントが発生し続けます。クライアント側での送信は成功しています。 このような事態が発生する原因としてはどのようなことが考えられますでしょうか?

  • Socket通信を待ち受け状態にするには

    Androidアプリの開発でJavaのSocketを使って通信しようと考えています。 現在、ソースが手元にない状態なのですが、 SocketDebuggerをサーバとして、クライアントプログラムを書きました。 流れは、指定のポート、アドレスに接続して入力された文字列をサーバが受け取り、 メッセージを返信するものです。 なのですが、サーバ側から再度メッセージを送信したときに今度はクライアント側で 受け取りそれにまた返信する…ということをやりたいのですが、今の状況ではサーバからのメッセージを受け取ることが出来ません。 プログラムは以下のサイトを参考にして少し書き換えました。 http://team-pag.interprism.co.jp/member/okazawa/blog/?p=687 今のままだとクライアント側から送信するとそのまま接続が終了してしまうのですが、 たとえば「exit」を受け取ったら接続をやめる、、それまではサーバからのメッセージも受け取れる状態にする…というようにやりたいです。 ご教授お願いします!!

  • WinsockによるUDP通信にて

    WinsockでUDP通信を行うプログラムを作っているのですが、 原因不明の問題が発生していて困っています。 通信手順は以下のとおりです。 (1) クライアントからサーバへ要求パケット送信 (2) 要求パケットを受け取ったサーバは、クライアントへACKを送信 (3) サーバが要求に対する応答パケットをクライアントへ送信 (4) 応答パケットを受け取ったクライアントは、サーバへACKを送信 クライアント-サーバ間でやりとりするデータは最大で992バイト、 それ以上になる場合は、分割して送信します。 パケットの分割が発生しない場合は、(1)~(3)がパケットの損失もなく通信できるのですが、 パケットの分割が発生する場合には、2回目以降の(4)のパケットがクライアントに届きません。再現率は今のところ100%です。 クライアント側のselect関数でもソケットを検出しません。 たしかにUDPは信頼性が低いですが、パケット分割が発生しないパターンでは100%届くので、UDPの仕様とは関係ないような気がします。 原因がさっぱりわからないので、アドバイスをお願いいたします。 ちなみに、クライアント、サーバともに同一端末内にあります(双方がループバックアドレスに対してパケットを送信)が、 これはテスト段階だからであって、本来はそれぞれ別々の端末で動作します。

  • SocketのSend関数でのCLOSEの検知 [Linux]

    Linux環境でSocket(dm:PF_INET,type:SOCK_STREAM)を使用しての、 Client&ServerプログラムをCで作成しているのですが、 そこでのSend関数の使い方についてご助力ください。 Client&Serverプログラムは下記のような動きをします。 [Client] ServerへConnectした後、複数のDataを数秒間隔でServerへ 送信(send関数使用)します。受信(recvやread関数等)は、 一切行いません。 [Server] ClientからのConnectを受け付けた後、Clientから受信(recv関数 使用)したDataを標準出力へ表示する。送信(sendやwrite関数 等)は、一切行いません。 さて、ここでもしClientプログラムがCloseを発行したり、マシン DOWN等の理由でConnectionが切断され、Server側のSocketが CLOSE_WAIT状態になった場合、Bufferに溜まっていたDataを すべて受けきった後、recv関数が0を返してくれるので 相手が終了したことがわかります。 ここからが質問のMainです。 では、もしServerプログラムがCloseを発行したり、マシン DOWN等の理由でConnectionが切断され、Client側のSocketが CLOSE_WAIT状態になっても、CLOSE_WAIT直後のsend関数が なぜか正常に処理されてしまいます。無論このDataは、 Server側は受け取りません。この次のsend関数実行時に EPIPEが返ってくるので、ここでようやくSocketが切断された ことが判ります。 これを何とかCLOSE_WAIT状態になった直後から、send関数で 切断を検知できるようにできないでしょうか。 よろしくお願いします。 以上

  • VB6.0 Winsockについての質問です。

    VB6.0 Winsockについての質問です。 はじめまして。 現在、VB6.0を使用してTCP通信にてテキストデータを送るプログラムを作成しています。 機能としては全て完成しているのですが、現在再接続ができないじょうたいです。 PC上にサーバプログラムとクライアントプログラムを立ち上げます。 localport は 0 として設定しており、 host は、localhostとしています。 remortportは5000を設定しております。 現段階で発生している問題として、 クライアント側にてConnectイベントをさせ、 サーバ側にて、ConnectionRequestイベントが発生します。 クライアント側にて、Closeイベントは発生させ、 サーバー側も切断を確認します。 この状態でクライアント側から再度Connectイベントを発生させても サーバ側にてConnectionRequestイベントが発生しません。 サーバ側のプログラム一度終了させ、もう一度起動させると また、接続が可能になります。 もう、2日以上悩んでいるのですが、、、解決できません。 どなたか、詳しい方がいらっしゃいましたらご教授お願いします。

  • Cliant から Server の Socket 管理

    サーバアプリを作成しています。 ServerSocket を生成してから 基本的に read() でクライアントからの データを待機しています。 その状態でクライアント側から close 処理を行いたいのですが どういう形にすれば正しく終了できるのでしょうか? クライアントから Socket の close() を行うと 空のデータが2回送られてきます。 例外が発生しているので finally で close させようと 思ったのですがビルドエラーになります。 どうかご教授お願いします。

    • ベストアンサー
    • Java
  • Winsock 受信について

    Winsockをサーバとクライアントで動かして送受信についてです。 サーバでSendDataで送信、クライアントでGetDataの所です。 サーバーでSendDataを数回送信するとクライアントのGetDataではある程度まとめて受信します。 (1)サーバ側で送信    Winsock.SendData "aaaaa"    Winsock.SendData "bbbbb"    Winsock.SendData "ccccc"    Winsock.SendData "ddddd" (2)クライアントで受信    Winsock.GetData xyz (1)のように送信した場合、(2)のxyzは    ・aaaaabbbbbcc    ・cccddddd のように数回に分けて受信されます。 希望としましては、1データ送信に対して1データ受信が望ましいのですが。 実際のデータには全角はある為、このような希望となりました。 もしかして、不可能なのでしょうか。 わかる方、教えて下さい。

  • winsockの非同期通信のsendイベント

    winsockの非同期通信で、 case FD_WRITE: にsend()関数を書いて送信させるのはごく普通のやりかたですね。 このイベントは、 接続直後と、送信バッファが一杯だった状態から送信が可能な状態に復帰したときに 呼ばれますよね。 これだと、ユーザーが好きなタイミングで、データを送信しようと思った時に送信できません。 でも100MBなんて大きなデータを送ると、送信バッファが溢れるので、 case FD_WRITE: にsend()を書きたい。 こういうとき、どのようにコードを書くのが、よろしいのでしょうか。