0

システム情報を Tcp/ip 経由でローカル ネットワーク経由で別のコンピューターに送信するスレッド関数を作成しようとしています。私はこれを達成するためにソケットを使用してきましたが、これはこれまでのところ問題なく機能しています。しかし、これで通常は機能するようになりましたが、約 30% の確率で、ソケットを開けないというエラー メッセージが表示されます。ソケットにはactiveSocketライブラリを使用しています。

#include "tbb/tick_count.h"
#include "ActiveSocket.h"

using namespace std;

CActiveSocket socket;
extern int hardwareStatus;



int establishTCP() {
 char time[11];
 int communicationFailed = 0;
 memset(&time, 0, 11);
 socket.Initialize();
 socket.SetConnectTimeout(0, 20);
 socket.SetSendTimeout(0, 20);
 return communicationFailed;
}


int monitor() {
 cout << "Monitor: init continious monitoring" << endl;
 int communicationFailed;
 tbb::tick_count monitorCounter = tbb::tick_count::now();
 while (!closeProgram) {
  tbb::tick_count currentTick = tbb::tick_count::now();
  tbb::tick_count::interval_t interval;
  interval = currentTick - monitorCounter;
  if (interval.seconds() > 2) {
   monitorCounter = tbb::tick_count::now();
   communicationFailed = 1;
   char buffer[256];
   sprintf(buffer, "%d;", hardwareStatus);

   establishTCP();

   char *charip = new char[monitoringIP.size() + 1];
   charip[monitoringIP.size()] = 0;
   memcpy(charip, monitoringIP.c_str(), monitoringIP.size());
   const uint8* realip = (const uint8 *) charip;
   int monitorCount = 0;
   cout << "Monitor: " << buffer << endl;
   while (communicationFailed == 1 && monitorCount < 2) {
    monitorCount++;
    if (socket.Open(realip, 2417)) {
     if (socket.Send((const uint8 *) buffer, strlen(buffer))) {
      cout << "Monitor: Succeeded sending data" << endl;
      communicationFailed = 0;
      socket.Close();
      } else {
       socket.Close();
       communicationFailed = 1;
       cout << "Monitor: FAILED TO SEND DATA" << endl;
      }
     } else {
       socket.Close();
       communicationFailed = 1;
       cout << "Monitor: FAILED TO OPEN SOCKET FOR DATA" << endl;
      }
     }
    if (monitorCount == 2) cout << "Monitor: UNABLE TO SEND DATA" << endl;
   }
  }
  return communicationFailed;
 }

私はこれらの機能で何か間違ったことをしていると思います。問題は、このデータが受信される回線の反対側にあるのではありません。このコードで、失敗の原因となる明らかな間違いを見つけられる人はいますか? 私は自分のcoutメッセージを受け取り続けます"Monitor: FAILED TO OPEN SOCKET FOR DATA"

編集: telnet を使用すると、100% の確率ですべて正常に動作します

4

3 に答える 3

1

netstatを使用して、サーバーがポートでリッスンしており、接続が確立されていることを確認できます。スヌープは、何が問題なのかを見つけるためのアーマーのもう 1 つの優れたアプリケーションです。もう 1 つの可能性はtelnet、クライアントがその IP アドレスとポートに接続できるかどうかを確認するために使用することです。コードに関しては、何かおかしくないかどうかを後で確認します。

于 2012-07-13T14:23:09.227 に答える
0

socketグローバル変数です。2つのスレッド間で同時に再利用される場合と、1つのスレッド内で順次再利用される場合があります。実際、while(~closeProgram)ループは、それを順番に使用するつもりであることを示しています。

読み取りに関するいくつかのドキュメントCActiveSocket::Open:「接続ベースのプロトコルソケット(CSocket :: SocketTypeTcp)は、Open()を1回だけ正常に呼び出すことができます...

.Open()同じオブジェクトを2回呼び出すと、プログラムが失敗する可能性があります。

于 2012-07-13T15:30:35.433 に答える
0

私は最終的に自分のコードの問題を発見しました。接続が不安定で、時間の 70% で動作していたため、タイムアウトの問題であると思われました。2 つのタイムアウト設定を削除しました

socket.SetConnectTimeout(0, 20);
socket.SetSendTimeout(0, 20);

トラブルシューティングのヒントをありがとう!

于 2012-07-16T08:09:29.697 に答える