0

全て。

TCP メッセージングにはオープン ソース ライブラリ stlplus を使用します。私の仕事のスキームは次のとおりです。

サーバーアプリケーションとクライアントアプリケーションがあります。それらは実行され、反対側が現れるのを待ってから、接続してメッセージを交換することができます。接続は、サーバーの IP アドレスとポート番号を使用して作成されます。

私の有線ローカルネットでは、すべて正常に動作します。プログラムは 1 つしか実行されていない場合は接続されず (明らかなようですが、さらに詳しく説明します)、接続されている場合は問題なくメッセージを交換します。

その後、ワイヤレスネットでテストすることにしました。そのため、あるノートブックでホストされたネットワークを作成し、別のノートブックから接続しました。また、2台のコンピューターのホームグループを作成しました。コンピューター間の ping (IP とポート) は問題ありません。Windows の msg.exe を使用してメッセージを送信することもできます。

そして今が問題です。クライアントプログラムは、サーバーが実行されていないときにサーバーに接続し、メッセージを送信することさえあると言います(ログに書き込みます)。それはどうしてですか?どの設定を省略できますか? 有線ネットで長時間使用しても、そのような問題は検出されませんでした。

ファイアウォールで特別な許可ルールを作成し、完全にオフにした後でも、状況は同じです。

何を確認したらよいのか、次に何をすればよいのかわかりません。

このコードで最も単純なハードコーディングされたサンプルを作成しましたが、結果は同じです(((

私は無限に「接続された」単語を取得します //======================================== ===================

#include <iostream>
// stlplus
#include "portability.hpp"
#include "strings.hpp"

using namespace stlplus;
int INI_TCP_TIMEOUT = 10000000;

int main (int argc, char* argv[])
{
  stlplus::TCP_client tcpClient("192.168.173.1", 139, INI_TCP_TIMEOUT);

  if (false == tcpClient.initialised() ) 
  {
    std::cout << "client: retry";
    return 0;
  }

  if (false == tcpClient.connected()) 
  {
    std::cout << "client: retry";
    return 0;
  }

  while (true == tcpClient.connected()) 
  {
    std::cout << "connected; \n";
  }

  return 0;
}
4

1 に答える 1

0

問題を解決しました。

問題の根本を扱ったかどうかはわかりませんが、誰が知っていますか。ここでは、誰かが同じ問題に遭遇した場合や、より明確にするために何かを追加できる場合に備えて、説明を書きます。

私のアプリケーションは次のように編成されました。別のスレッドでサーバーを起動するクラスがありました。私はそのクラスのインスタンスを 2 つ持っているので、ほぼ同時に 2 つのサーバーが作成されました。そして、エラーメッセージ10093で初期化できなかったことがわかりました(WSAStartupがまだ呼び出されていないか、WSACleanupが既に呼び出されています)。

ip_socket クラス内でデバッグしようとしましたが、マルチスレッドに問題がありました。そのため、サーバー作成の直前にロックされ、直後にロック解除されるミューテックスを作成しました。

その後、すべての問題がなくなりました。

于 2015-11-23T08:04:17.143 に答える