怎样判断TCP协议发送失败?解决方法
怎样判断TCP协议发送失败?
比如我在客户端,用TCP连接,向服务器发送一个数据包:
if(send(hsock, (char *)&s, len, 0) == SOCKET_ERROR)
MessageBox(NULL, _T("发送失败!"), NULL, MB_ICONERROR);
我在本地没有弹出“发送失败”的提示窗口,并不表示发送成功了,因为它只是放到发送缓冲区了,不能保证服务器一定收到。
可是如果因为某种故障,服务器并没有收到(可能是网络传输的问题),那我在本地如何知道发送没有成功呢?
我的笨拙的做法是:服务器收到数据后,向客户端发送一个包,表示收到了,可是这样使得程序变得复杂。
我听说:TCP协议本身就是可靠连接,那协议本身有没有一种机制,使得服务器没有收到时,我本地能知道呢?
(查资料说:TCP协议本身有一种机制:发送以后,会启动一个定时器,对方没有收到,本地计时器超时后,会重发,可是,它只是重发,并不会提示我,可是我作为程序编制者,如何知道没有发送成功呢?以便进入错误处理程序呢?)
------解决思路----------------------
我听说:TCP协议本身就是可靠连接,那协议本身有没有一种机制,使得服务器没有收到时,我本地能知道呢?
--------
首先所谓的可靠连接 不是你想要的长连接,你send之前总要connect吧?你想多了,TCP只是能做到尽量可靠一点不是全包全揽。
send成功只是告诉你内容全部发走了,能不能收到不知道啊,路上还得走好多节点服务器呢。
所以你想知道对方收到没收到,还得对方给你回复。
只能这样了,长连接就是这么干的,即所谓的心跳机制,有的人用的是TCP的参数选项,多数人就是自己send来send去这么玩的。
比如我在客户端,用TCP连接,向服务器发送一个数据包:
if(send(hsock, (char *)&s, len, 0) == SOCKET_ERROR)
MessageBox(NULL, _T("发送失败!"), NULL, MB_ICONERROR);
我在本地没有弹出“发送失败”的提示窗口,并不表示发送成功了,因为它只是放到发送缓冲区了,不能保证服务器一定收到。
可是如果因为某种故障,服务器并没有收到(可能是网络传输的问题),那我在本地如何知道发送没有成功呢?
我的笨拙的做法是:服务器收到数据后,向客户端发送一个包,表示收到了,可是这样使得程序变得复杂。
我听说:TCP协议本身就是可靠连接,那协议本身有没有一种机制,使得服务器没有收到时,我本地能知道呢?
(查资料说:TCP协议本身有一种机制:发送以后,会启动一个定时器,对方没有收到,本地计时器超时后,会重发,可是,它只是重发,并不会提示我,可是我作为程序编制者,如何知道没有发送成功呢?以便进入错误处理程序呢?)
------解决思路----------------------
我听说:TCP协议本身就是可靠连接,那协议本身有没有一种机制,使得服务器没有收到时,我本地能知道呢?
--------
首先所谓的可靠连接 不是你想要的长连接,你send之前总要connect吧?你想多了,TCP只是能做到尽量可靠一点不是全包全揽。
send成功只是告诉你内容全部发走了,能不能收到不知道啊,路上还得走好多节点服务器呢。
所以你想知道对方收到没收到,还得对方给你回复。
只能这样了,长连接就是这么干的,即所谓的心跳机制,有的人用的是TCP的参数选项,多数人就是自己send来send去这么玩的。