• 締切済み

受信待機

こんばんは。 現在通信機能をもつアプリケーションを作成しています。 CSocketを使用して、同期通信です。 質問です。 クライアントから、サーバにメッセージを投げます。 するとサーバはこのメッセージを解析して、ローカルで処理をし、その結果をクライアントに返します。 問題なのは、クライアントでは、サーバからの結果を受信してからその次の処理を行いたいので、受信待機したいのですが、その方法がわからないのです。 このような処理の方法をご教授ください。 よろしくお願いします。

みんなの回答

回答No.2

OnReceiveイベントはオーバーライドしてますか?

全文を見る
すると、全ての回答が全文表示されます。
noname#9414
noname#9414
回答No.1

一番簡単なのは、クライアントから接続したソケットを閉じないで、サーバが処理を終えるまで保持し続けることでしょう。 仮にクライアントから接続したソケットを閉じるとすると、クライアント側にもサーバとしての機能を持たせなくてはいけなくなります。 単純にrecv関数で待たせておけばいいと思いますが・・・どれくらいクライアントが待つ可能性があるか次第ですね。 ではでは☆

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CSocket通信での待機処理について

    VC++2008にて、サーバとクライアントPCにて、相互通信を行うプログラムを作成しています。 クライアントは、CSocketを利用しマルチスレッドにて通信を行っています。 thread_start→マルチスレッド作成→ CSocket::Sendでサーバへメッセージ送信→ CSocket::OnReceiveでサーバのメッセージ受信→ サーバメッセージから処理実行と言った流れです。 通常の処理は、この流れで問題ないのですが、 ある処理の場合、thread_startをforループで数回繰り返す 処理を行っています。 この時、データにタイムラグが出てしまうため、 thread_startから処理実行までの一連の流れが終了するまで、 次のthread_startは呼ばれずに待機させたいのですが、 どのようにすれば良いのかが分かりません。 Sendを呼んだタイミングで、 WaitForSingleObjectでスレッドのハンドルを渡したり、 CreateEventでイベントハンドルを渡したりしてみたのですが、 WaitForSingleObjectを呼ぶと、OnReceiveで受信する前で 止まってしまうため、そのままフリーズ状態になってしまいます。 どのタイミングでWaitFor~を呼ぶべきなのか、 もしくは、何か別の手段があるのでしょうか?

  • UDP通信での受信方法について

    MFCでUDPプロトコルを使ったサーバー・クライアントをソケットプログラムで書いております。 ソフトの内容は、クライアントから送信されたの文字列のコマンドをサーバで処理をするだけです。 サーバー側での受信の仕方は WSAAsyncSelect()関数を使ってソケットイベントが発生するごとに親ウィンドウに自作のメッセージ(WM_MY_MSG)が送られるように設定する ↓ WM_MY_MSGのメッセージハンドラ内でrecvfrom()関数を使って受信する。 という方法を用いています。クライアント2台ぐらいであれば正常に動きます。 質問1: まだ試したことはないのですが(というより試す環境がない)、ほぼ同時ぐらいに複数(10台ぐらい)のクライアントからコマンドが送信された場合、それを全部正確に受信できるものなのでしょうか?要するに一つのコマンドを処理中に別のコマンドが送られてきた場合の動作はどうなるのでしょうか? 質問2: UDP通信での受信をする場合の何かもっとスタンダードな方法があるのでしょうか? よろしくお願いします。

  • ファイル送受信のためのネットワークプログラミング

    現在、CSocketを用いて、クライアントPCとサーバとの メッセージの送受信プログラムを作成しています。 文字列での送受信は出来たのですが、 ファイルを送受信する方法が分かりません。 CSocketやCAsyncSocketでは、ファイルの送受信は出来ないのでしょうか?

  • 【CAsyncSocket::OnReceive()呼び出しが遅れる?

    【CAsyncSocket::OnReceive()呼び出しが遅れる?】 MFCのCAsyncSocketを使ってTCP/IPクライアントアプリケーションより、 別マシン上のサーバアプリケーションに対して、以下の手順で非同期通信をおこなっています。 【クライアント】※以下CAsyncSocketの派生クラス関数です 接続:Connect() 電文送信:Send() *送信通知:OnSend() ※送信しきれなかったデータ送信 (実際には送信処理の分割は発生していません) *受信通知:OnReceive() 電文受信:Recv() ※ヘッダ部約60バイト分受信 受信通知:OnReceive() -----------複数回受信を想定 →電文受信:Recv() ※残りのデータ受信 ↓ (データ受信完了後) 通信終了:ShutDown() 切断:Close() クライアントから送信する電文データサイズは6000バイト弱の固定長です。 サーバから返信される電文データサイズは6000バイト弱または100バイト弱どちらかの固定長です。 サーバアプリケーションは、クライアントからの電文受信後すぐに応答電文を返信しています。 現在、*印のOnSend()呼び出し~OnReceive()呼び出しの間で、ある環境では3、4秒程度必ずかかります。 (受信電文データサイズ6000バイト弱・100バイト弱どちらも発生します) ヘッダ部約60バイト受信後は、遅れは発生していないようです。 CAsyncSocket::SetSockOpt()で送信・受信バッファサイズを65537バイトに設定してみたのですが、 改善されませんでした。 同じ(と思われる)環境を自作して(サーバアプリはテスト用自作アプリ)試してみたのですが 今のところ再現しません。 SocketDebuggerFree(http://sdg.ex-group.jp/)を使用して同じ電文データをサーバアプリに 送信してみたところ、上記のような遅延は発生せず送信後すぐに応答電文受信処理が実行されました。 パケット分割が発生しているようで、6000バイト弱のデータを3回に分けて受信しています。 クライアントアプリでもそのように分割受信されることを想定したのですが、ヘッダ部を受信した 後に1回のOnReceive()内で残りのデータすべてをReceive()によって受信しています。 (自作環境では、ヘッダ部受信後OnReceive()×2回で残りのデータを受信しています) ちなみに、クライアントマシンよりサーバマシンに社内LANを経由して接続してみたところ、 *印間の処理で2秒程度の遅延が発生します。SocketDebuggerFreeでは遅延が発生しません。 試しに、CSocketクラスとCSocketFileクラスを使用して以下の手順で処理を実行してみましたが、 同様に*印の処理の間で3、4秒程度の受信遅れが発生しました。 CSocket::Create() CSocket::Connect() *CSocketFile::Write() *CSocketFile::Read() ※ヘッダ部約60バイト分受信 CAsyncSocket::IOCtl(FIONREAD, XXX) ←※必要なデータサイズ分受信可能になるまでループ CSocketFile::Read() ※残りのデータ受信 : 上記のソケット関連関数をAPIの関数に入れ替えてみたのですが、変わりはありませんでした。 自作環境では、受信遅れは発生していません。 遅れが発生する環境の詳細がわからないので恐縮ですが、なにかお気づきの点をご指摘いただければ 幸いです。 開発環境 OS:Windows XP Professional Version 2002 SP3 Microsoft Visual C++ .NET クライアントアプリの運用環境 OS:Windows Server 2003(SP2?) サーバアプリの運用環境 不明

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

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

  • メールが受信出来ない・・・

    今日、いつも通りにメールボックスを開いたんです。 そしたら『メールの受信中です』という表示が出ているのにいくら待ってもメールが受信されないんです。 しばらく待っていると 『後~秒間サーバーが応答しません。 待機しますか?』という表示が・・・ 待機していると更に↑と同じ表示が。 停止すると『サーバーと通信しようとして、タイムアウトが発生しました。』と表示されます。 こういう場合、どうすれば良いのでしょう・・・?

  • 直接インターネット接続できない環境でのGoogle Mapsの利用について

    インターネットにアクセス可能なアプリケーションサーバAとインターネットにアクセスできないアプリケーションサーバBがあります(サーバAとサーバBは直接通信が可能です)。 クライアントPCはサーバBにのみアクセス可能な環境であるという制約があり、その制約下で処理結果にGoogle Maps等の地図情報を埋め込みたいのですが、地図情報の取得のみサーバAにより実行し、その結果をサーバB経由でクライアントPCに返すというような処理の実装は可能でしょうか。 漠然としたご質問で申し訳ございません。

  • メール既受信と未受信の判別はどこで?・・・

    最近、契約していたプロバイダを変更しました。そしてメールを受信してみると、以前に既に受信してからもメールサーバから削除していなかったメールメッセージが再び受信されてしまいました。もちろん使用しているPCはプロバイダ変更以前と同じマシンです。 メールサーバに既受信済みのメッセージを残していたのは、別のPCでまた受信させたい為です。 Outlookなどのメールクライアントがメールサーバに新規メッセージの受信の為にアクセスした際に、既に受信済みのメッセージは、たとえそのメッセージをサーバから削除していなくても、通常は同じメッセージを再取得はしないと思うのですが、その既受信と未受信の区別はいったいどこで判別されているのでしょうか? 説明が拙くて質問の内容が理解して頂けるかどうか、チョット不安ですが、判る方のアドバイスをお待ちしております。どうぞよろしくお願い致します。

  • VB.NETによるTCP通信プログラムについて

    VB.NETによるTCP通信プログラムについて VB.NETによりTCP通信プログラムを開発しようと思っておりますが、TCP通信はクライアントとサーバーに機能が分かれると思いますが、一つのアプリケーションでサーバー機能とクライアント機能を有するアプリケーションは開発が可能でしょうか? サンプルプログラムを探しているのですが、どれも、クライアントとサーバーのどちらかの機能だけですが、両機能を持ち合わせたサンプルを掲載されているサイトをご存じの方は、お手数ですが、教えて頂けると助かります。 ご教授のほど、よろしくお願い致します。 Windows XP SP3 Visual Studio 2008 Visual Basic

  • 『Winsock error』の存在意義と処理方法

    WindowsCEマシンのtcp/ip通信をEVC++で組んでいます。 ●非同期通信クライアント ●非同期通信サーバ ●同期通信クライアント ●同期通信サーバ の4種類を組んでいます。 堅牢性をアップさせるため、『Winsock error』が発生した時に、 リトライなどの 処理を考えているのですが、参考になる体験談、URL、書籍など有りましたら、お教え頂きたいと思います。 (WindowsとWindowsCEの違いで気を付ける点もあればそれもお教え願います。)  やはり、winsock errorというのは、発生原因を知らせるために、printf等で表示する程度(結局、アプリケーションで回避できるようなトラブルであれば、OSが回避し、ソフト的に回避できない物理的なトラブルを通知する程度)なのでしょうか?

インク残量が感知できない
このQ&Aのポイント
  • MFC-J998DWNのインク残量が感知できない問題について相談します。
  • Windows10で有線LAN接続している環境で、インク残量が正しく表示されないトラブルが発生しています。
  • ひかり回線を使用しているため、電話回線の種類はひかり回線です。
回答を見る

専門家に質問してみよう