2012-07-13 74 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