读书人

tcp 感知对方连接状态有关问题

发布时间: 2012-04-13 13:50:24 作者: rapoo

tcp 感知对方连接状态问题
我想问一下使用
winsock api(非CSocket)
1、编写程序感知TCP 的 peer端的连接状态怎么办,通过什么函数判断?
2、udp用得着判断连接状态吗?还是只管发就行?能感知peer的状态吗?
第一个是比较想知道的放在第一位。

[解决办法]
设置KEEPLIVE
[解决办法]
问题一:
1、数据接收和发送时,根据返回值可以判断连接是否断开。
2、定期keepalive,可以比较及时知道连接断开。
3、tcp协议栈keepalive判断,这个值一般比较大,不太及时。

问题二:
udp是无连接的,因此无所谓断开的问题。

探讨
我想问一下使用
winsock api(非CSocket)
1、编写程序感知TCP 的 peer端的连接状态怎么办,通过什么函数判断?
2、udp用得着判断连接状态吗?还是只管发就行?能感知peer的状态吗?
第一个是比较想知道的放在第一位。

[解决办法]
对于TCP,用SO_KEEPALIVE选项,时间值可以用WSAIoctl函数设定SIO_KEEPALIVE_VALS选项来更改,也可以自定义应用层心跳
至于UDP,UDP是无连接的协议
[解决办法]
探讨
弄一个udp端口 + 1个线程, 做心跳就行了~

另外, TCP正常的关闭是read得到0, 或者select/poll/epoll等触发了HUP/ERR事件. UDP只能制定通讯协议, 来获知对端正常关闭, 或者是做心跳检查异常关闭.

[解决办法]
recv这个API的说明认真看一下,它返回0表示对方链接状态关闭,-1表示网络出现错误,其他表示接收到多少。
select可以监视TCP事件。TCP状态你要关心的无非是1:连接上了。2:有数据到了。3:可以发数据了,虽然这个一般很少考虑,但是你要考虑流浪很大可能会拥塞的话就要考虑。4:连接关闭了。
这些事件都是通过select监视到相应的事件得到的。
[解决办法]
探讨
TCP也是通过发包才能知道连接状态的
如果你不发包 只是把网线拔了在接上 应用层根本不知道
UDP你想知道也可以让接受方在应用层给你回一个就可以了

读书人网 >C++

热点推荐