簡體   English   中英

C ++中的TCP / Ip網絡通訊

[英]TCP/Ip network communication in c++

我正在嘗試編寫一個線程函數,該函數通過本地網絡上的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;
 }

我想我在這些功能上做錯了,問題不在接收此數據的那一邊。 誰能在此代碼中看到任何明顯的錯誤,從而導致失敗? 我不斷收到自己的提示信息: "Monitor: FAILED TO OPEN SOCKET FOR DATA"

編輯:使用telnet,一切正常,時間100%

您可以使用netstat來檢查服務器是否正在偵聽端口並建立連接。 Snoop是Armor中另一個用於發現問題出在哪里的好應用程序。 另一種可能性是使用telnet查看客戶端是否可以連接到該IP地址和端口。 至於代碼,我稍后會看一下,看是否有問題。

socket是一個全局變量。 它可以在兩個線程之間並發使用,也可以在一個線程內按順序使用。 實際上, while(~closeProgram)循環表明您打算順序使用它。

CActiveSocket::Open某些文檔顯示:“ 基於連接的協議套接字(CSocket :: SocketTypeTcp)只能成功調用Open()一次...

當您在同一對象上兩次調用.Open()時,程序可能會失敗。

我最終發現我的代碼有問題。 由於連接不穩定並且在70%的時間內都正常工作,因此似乎是超時問題。 我刪除了兩個超時設置

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

現在,它工作得非常好,不過感謝您提供的故障排除提示!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM