小妹急问:PC做服务器,接多台ARM嵌入式,如何及时的判断连接台数
小妹急问:PC做服务器,接多台ARM嵌入式,怎么及时的判断连接台数?
一个C/S项目,是基于ARM的多台嵌入式系统连接PC,PC做服务器接收多台ARM的数据。我用的是WSAAsyncSelect模式。现在的情况是:连接、接收数据都没有问题,但是如果有一台ARM中间断开后,PC要过大概30秒才能判断连接断开。
我之前在VC中,用WSAAsyncSelect注册FD_ACCEPT 、FD_CLOSE消息来判断连接的台数,但是发现很多时候连接断开后并没有收到FD_CLOSE消息!现在我用给每台客户端发送心跳包的形式来检测连接台数,也就是每隔一秒给每个SOCKET发送心跳数据,如果发送成功,表明连接正常,如果发送不出,则表明连接断开。如下:
n=send(p-> m_clients[i], (char*)comcode, 6, 0);
根据n的返回值来判断是否发送成功。
现在的问题是:这样判断,总体结果是正确的,也就是说如果有断开时,过30秒后显示的连接台数才是正确的!这显然无法让人接受!
请问各位怎么让其中一台客户端网络断开时,VC立即就知道断开了?
------解决方案--------------------
检测是否掉线的线程的实现如下:
发送心跳包的线程:(每1秒发送1次)
while(1)
{
sendHeartPkg();//收到信号包的下位机应答该心跳包,(该心跳包最好广播发送)
sleep(1000);
}
检查是否掉线的线程:
while(1)
{
checkOffline();//检查是否有应答(如3次检查都没有应答,则表示设备掉线,前提设备如果没有掉线,3秒内必定有应答)
sleep(1000);
}
这种方式3秒内就可以检测出设备是否掉线,看你的需要来改变检测时间
当然了你也可以用定时器实现,检测和发送心跳包可以放同一个线程
一个C/S项目,是基于ARM的多台嵌入式系统连接PC,PC做服务器接收多台ARM的数据。我用的是WSAAsyncSelect模式。现在的情况是:连接、接收数据都没有问题,但是如果有一台ARM中间断开后,PC要过大概30秒才能判断连接断开。
我之前在VC中,用WSAAsyncSelect注册FD_ACCEPT 、FD_CLOSE消息来判断连接的台数,但是发现很多时候连接断开后并没有收到FD_CLOSE消息!现在我用给每台客户端发送心跳包的形式来检测连接台数,也就是每隔一秒给每个SOCKET发送心跳数据,如果发送成功,表明连接正常,如果发送不出,则表明连接断开。如下:
n=send(p-> m_clients[i], (char*)comcode, 6, 0);
根据n的返回值来判断是否发送成功。
现在的问题是:这样判断,总体结果是正确的,也就是说如果有断开时,过30秒后显示的连接台数才是正确的!这显然无法让人接受!
请问各位怎么让其中一台客户端网络断开时,VC立即就知道断开了?
socket
嵌入式系统
c/s
------解决方案--------------------
检测是否掉线的线程的实现如下:
发送心跳包的线程:(每1秒发送1次)
while(1)
{
sendHeartPkg();//收到信号包的下位机应答该心跳包,(该心跳包最好广播发送)
sleep(1000);
}
检查是否掉线的线程:
while(1)
{
checkOffline();//检查是否有应答(如3次检查都没有应答,则表示设备掉线,前提设备如果没有掉线,3秒内必定有应答)
sleep(1000);
}
这种方式3秒内就可以检测出设备是否掉线,看你的需要来改变检测时间
当然了你也可以用定时器实现,检测和发送心跳包可以放同一个线程