2012-07-13 42 views
0

我正在嘗試編寫一個線程函數,通過本地網絡上的TCP/IP發送系統信息到另一臺計算機。我一直在使用套接字來實現這一點,到目前爲止,這已經非常成功。但我現在處於這種情況通常可以正常工作的時間點,但大約有30%的時間我收到錯誤消息,告訴我無法打開套接字。我使用activeSocket庫作爲套接字。在c + +中的TCP/IP網絡通信

#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%的時間

+0

名稱爲「socket」的變量的類型是什麼? – 2012-07-13 15:07:27

+0

哎呀,忘了更改名稱,這是一個CActiveSocket – 2012-07-13 15:12:06

回答

0

我終於找到了我的代碼的問題。由於連接不穩定,70%的時間工作似乎是超時問題。我刪除了兩個超時設置

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

現在它工作得很好,感謝故障排除技巧,儘管!

1

您可以使用netstat來檢查服務器偵聽的端口和連接正在建立。 Snoop是你的裝甲中的另一個很好的應用,用於找出發生了什麼問題。另一種可能性是使用telnet來查看客戶端是否可以連接到該IP地址和端口。至於代碼,我稍後會看看它是否出了問題。

+0

謝謝,我應該提到,用telnet一切都很好,在我的問題。我會嘗試netstat,看看我能找到什麼。 – 2012-07-13 14:28:03

0

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

一些documentation for CActiveSocket::Open寫着:「基於連接的協議套接字(CSocket類:: SocketTypeTcp)可以成功地調用open()只有一次...

也許你的程序的時候,你在同一個呼叫.Open()兩次失敗目的。

+0

我在單獨線程中使用此函數是,但是沒有其他對全局套接字對象的調用。我正在順序使用這個對象,但'socket.Close()'應該可以再次使用'socket.Open'。 – 2012-07-13 15:48:19