none
ソケット同期・非同期通信。 RRS feed

  • 質問

  • いつもお世話になっております。ソケット通信に関しての質問があります。以下のように同期ソケットにて、送信してすぐに応答を受信するというサンプルは正常に動作しました。

    http://msdn2.microsoft.com/ja-JP/library/system.net.sockets.socket.aspx

    私の環境では同じソケットでサーバーからのメッセージを非同期で待つ必要があるため、接続後すぐにBeginReceiveを行っています。この状態で上と同じことを行うとReceiveする前に非同期で受信してしまいます。Receiveで同期的に受信するにはSendする前にBeginReceiveをキャンセルする必要があるかと思いますがその方法がわかりません。EndReceiveするにはIAsyncResultが必要ですが、これを取得する方法がわかりません。キャンセルする方法、もしくは別の方法があればご指導ください。よろしくお願いいたします。

    環境:VS2005 C#2.0 WinXP

    2006年6月2日 5:17

回答

  •  Myon さんからの引用

    ため、接続後すぐにBeginReceiveを行っています。この状態で上と同じことを行うとReceiveする前に非同期で受信してしまいます。Receiveで同期的に受信するにはSendする前にBeginReceiveをキャンセルする必要があるかと思いますがその方

    BeginReceiveをキャンセルするって意味がよくわかりませんが、まずは、

    http://msdn2.microsoft.com/ja-jp/library/fx6588te.aspx
    http://msdn2.microsoft.com/ja-jp/library/bew39x2a.aspx

    を参考にして、BeginReceive EndReceive, BeginSend,EndSend の使い方を理解すると良いかと。

    それと、クライアントとサーバーで、同期を取るには、上記のページにあるように、ManualResetEventなどの同期オブジェクトを使って、同期することになると思います。

    2006年6月2日 8:02
  • ありがとうございました。ManualResetEventは使ったことがありませんので勉強してみます。とりあえず解決とさせていただきます。
    2006年6月5日 0:17

すべての返信

  •  Myon さんからの引用

    ため、接続後すぐにBeginReceiveを行っています。この状態で上と同じことを行うとReceiveする前に非同期で受信してしまいます。Receiveで同期的に受信するにはSendする前にBeginReceiveをキャンセルする必要があるかと思いますがその方

    BeginReceiveをキャンセルするって意味がよくわかりませんが、まずは、

    http://msdn2.microsoft.com/ja-jp/library/fx6588te.aspx
    http://msdn2.microsoft.com/ja-jp/library/bew39x2a.aspx

    を参考にして、BeginReceive EndReceive, BeginSend,EndSend の使い方を理解すると良いかと。

    それと、クライアントとサーバーで、同期を取るには、上記のページにあるように、ManualResetEventなどの同期オブジェクトを使って、同期することになると思います。

    2006年6月2日 8:02
  • ありがとうございました。ManualResetEventは使ったことがありませんので勉強してみます。とりあえず解決とさせていただきます。
    2006年6月5日 0:17