怎样判断TCP协议发送失败?

mbctb 2015-11-01 03:14:39
比如我在客户端,用TCP连接,向服务器发送一个数据包:

if(send(hsock, (char *)&s, len, 0) == SOCKET_ERROR)
MessageBox(NULL, _T("发送失败!"), NULL, MB_ICONERROR);

我在本地没有弹出“发送失败”的提示窗口,并不表示发送成功了,因为它只是放到发送缓冲区了,不能保证服务器一定收到。

可是如果因为某种故障,服务器并没有收到(可能是网络传输的问题),那我在本地如何知道发送没有成功呢?

我的笨拙的做法是:服务器收到数据后,向客户端发送一个包,表示收到了,可是这样使得程序变得复杂。

我听说:TCP协议本身就是可靠连接,那协议本身有没有一种机制,使得服务器没有收到时,我本地能知道呢?

(查资料说:TCP协议本身有一种机制:发送以后,会启动一个定时器,对方没有收到,本地计时器超时后,会重发,可是,它只是重发,并不会提示我,可是我作为程序编制者,如何知道没有发送成功呢?以便进入错误处理程序呢?)
...全文
1971 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
内核协议栈调试麻烦。看到一个单线程的用户态TCP/IP协议栈,调试方便

https://github.com/wangbojing/NtyTcp
daojian5173 2017-05-03
  • 打赏
  • 举报
回复
楼主,你现在是在自己搞程序还是工作了
xian_wwq 2015-11-04
  • 打赏
  • 举报
回复
引用 楼主 mbctb 的回复:
比如我在客户端,用TCP连接,向服务器发送一个数据包: if(send(hsock, (char *)&s, len, 0) == SOCKET_ERROR) MessageBox(NULL, _T("发送失败!"), NULL, MB_ICONERROR); 我在本地没有弹出“发送失败”的提示窗口,并不表示发送成功了,因为它只是放到发送缓冲区了,不能保证服务器一定收到。 可是如果因为某种故障,服务器并没有收到(可能是网络传输的问题),那我在本地如何知道发送没有成功呢? 我的笨拙的做法是:服务器收到数据后,向客户端发送一个包,表示收到了,可是这样使得程序变得复杂。 我听说:TCP协议本身就是可靠连接,那协议本身有没有一种机制,使得服务器没有收到时,我本地能知道呢? (查资料说:TCP协议本身有一种机制:发送以后,会启动一个定时器,对方没有收到,本地计时器超时后,会重发,可是,它只是重发,并不会提示我,可是我作为程序编制者,如何知道没有发送成功呢?以便进入错误处理程序呢?)
要保证数据通讯可靠,就是需要应答机制来保证, server没有应答信息回来,是没有办法来最终确认的
kwer 2015-11-03
  • 打赏
  • 举报
回复
我听说:TCP协议本身就是可靠连接,那协议本身有没有一种机制,使得服务器没有收到时,我本地能知道呢? -------- 首先所谓的可靠连接 不是你想要的长连接,你send之前总要connect吧?你想多了,TCP只是能做到尽量可靠一点不是全包全揽。 send成功只是告诉你内容全部发走了,能不能收到不知道啊,路上还得走好多节点服务器呢。 所以你想知道对方收到没收到,还得对方给你回复。 只能这样了,长连接就是这么干的,即所谓的心跳机制,有的人用的是TCP的参数选项,多数人就是自己send来send去这么玩的。
赵4老师 2015-11-02
  • 打赏
  • 举报
回复
服务端收到心跳包,要主动发回一个数据,表示收到这个心跳包。
mbctb 2015-11-01
  • 打赏
  • 举报
回复
引用 1 楼 adan_shaw_VC 的回复:
send() 函数是同步的,如果返回不是 SOCKET_ERROR 应该是已经发送完毕了。 --对于这句话:它只是放到发送缓冲区了,我不这么认为;这是同步socket,应该是发送缓冲区发送完了,清空,再返回。 具体服务器是什么模型?MFC 绑定窗口消息?还是IOCP?你看看服务端 接受数据的设计吧。
就是一 个客户端和一个服务器端,建立TCP连接。 客户端需要发送心跳包,以维持在线(万一客户端是在内网中,维持路由器的sension),我在客户端每隔60秒发送一次心跳包,我想问的是:服务端收到心跳包,是不是要主动发回(就是我在编程的时候主动发回,而不是TCP协议内部的)一个数据,表示收到这个心跳包了? 我的意思是:对于通常的C-S结构,客户端发送一个心跳包,需要不需要在服务端的程序里,返回一个数据表示收到了?(是程序主动返回,不是TCP协议内部的对程序员透明的通信机制)。
gnorth 2015-11-01
  • 打赏
  • 举报
回复
服务端是被动的,客户端请求服务端干某件事,服务端做完了,把处理结果返回给客户端,你的客户端就知道成不成功了,不成功就重连。
hacker_adan 2015-11-01
  • 打赏
  • 举报
回复
send() 函数是同步的,如果返回不是 SOCKET_ERROR 应该是已经发送完毕了。 --对于这句话:它只是放到发送缓冲区了,我不这么认为;这是同步socket,应该是发送缓冲区发送完了,清空,再返回。 具体服务器是什么模型?MFC 绑定窗口消息?还是IOCP?你看看服务端 接受数据的设计吧。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧