GPRS服务器端信息发送的问题
大家有没有碰到过客户终端采用GPRS(TCP)连接了服务器进行通讯,但有一段时间客户可能进入了地下室或者电梯里面或者信号屏蔽很厉害的大楼里面不出来,这时候服务器上该客户的连接还是存在的并且可以往下发送信息的,但这个信息到不了客户那里,而且服务器上WSASend函数也不会报错,有没有办法知道这时候服务器发送数据是失败的呢?
客户端会采用心跳的方式保持跟服务器的通讯线路,服务器会定期检查客户端最后通讯的时间,如果超出一定的时间(比如2~3个心跳时间间隔之后)的话说明这个客户端已经无法再次发送信息了,服务器会把它踢掉。但现在的问题是在这2~3个心跳间隔之内服务器要给客户端发送数据的话,服务器上看起来是发送成功了的(WSASend函数不会报错),但客户端确实是收不到的。有办法知道服务器下发的数据是否正常吗?
服务器采用的IOCP,除了让终端每接收一次服务器的信息都要有一个回执(也就是服务器检测发送超时没有回执回复)之外还有别的办法吗?操作系统在处理TCP信息的时候有这方面的错误吗?
TCP通讯是双向握手和重发的,上面我说的情形终端侧肯定掉线了,原则上说的话,服务器上应该发不下去信息的(因为对方的端口已经过期了,只是移动还未给T掉而已,所以服务器上还正常发信息)。
[解决办法]
这个办法很多。
1、双方通信时,你可以人为添加 握手协议。比如接受方 接收到任何信息,可以让其先立即返回ASK。
这样服务器发送信息,超过一定时间没收到ASK,就可以认为已经断链啦,自己就知道了啊。
2、既然采用TCP通讯,你可以实现IP的PING,比如超过多少时间,PING下
[解决办法]
lz的问题一个是信号不好。
第二可能是不是专线专用,所以就出现了这个问题。
如果是信号不好,那实在是没有好的解决办法。
如果是线路不好(移动提供的线路),那可以在服务器端添加一个socket维护,如果长时间不能接收或者发送数据,那么服务器端应该主动断掉某一个socket,然后重新建立新的socket连接。