请问同步方式和异步方式的区别

zsgszy 2003-09-18 08:12:53
在同步方式下,发送函数返回时,是不是意味着我要发送的信息已经到达对方的缓冲区内?在异步方式下又如何呢?
...全文
409 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hewwatt 2003-09-18
  • 打赏
  • 举报
回复
To dchengwang,

你对同步/异步和TCP/UDP明显混淆了。

你如果手边有LINUX,你可以试着打开tcpdump,看一下,当你程序中send返回时,
tcpdump是否每次都已经收到目的端的TCP的ACK应答包。(最好连一个比较远的机
器,在网上可以找到很多连接很慢的HTTP服务器的,就用它的80端口去连好了,
这样效果更明显)

还可以这样试一下,最好中间有一个网关或HUB,你在网关这一边的机器上跑一个程序
建立一个到网关另一头某台机器的TCP连接,然后,你把那台机器的网线拔了,这时
候你再单步跟踪send的调用,发一个小包,看看它是不是能够成功返回。

看到运行结果后,你就会发现你上述的理解是偏颇的。
zsgszy 2003-09-18
  • 打赏
  • 举报
回复
to Hewwatt,

请问运行的结果如何呢,能解释一下吗?
dchengwang 2003-09-18
  • 打赏
  • 举报
回复
我觉得同步方式和异步方式用函数是说不清楚的,同步(异步)方式是一种机制。同步方式是指必须得到确认之后才能进行下一个事件,就是的阻塞摸式,如TCP,异步方式则不需要,即非阻塞摸式,如UDP
Hewwatt 2003-09-18
  • 打赏
  • 举报
回复
都不是:
同步方式发送成功返回,和异步方式调用请求最终完成(通过重叠I/O,完成端口获知)
都只表示用户提供的数据已经存放入系统TCP/IP协议栈的发送缓冲中,只要有可能
这些缓冲就会立即或稍后经由网络发送出去。

一句话,当发送请求成功后,你唯一可以相信的就是数据已经在路上了,你没有机会
保证数据一定最终到达目对端,也没有机会不让这些数据发送过去。

当同步发送被阻塞或者异步请求长时间不能完成,只能说明:
如果是TCP的话,那就是系统缓冲区中还有数据未发送,或者数据虽然发送了,但是
一直没有得到目的端TCP的ACK应答,因此由于这些数据不能从系统缓冲区中移走(否则
的话无法实现TCP超时重传等机制),而导致缓冲区不可用(不能再接收用户新的发送数据
的提交)。

如果是UDP的话,最可能的情况是用户发送数据的频率过快,或系统缓冲区相对过小。
vagabondkq 2003-09-18
  • 打赏
  • 举报
回复
同步方式:函数返回,代表要发送数据到达自己的发送缓冲区内;
异步方式:函数立即返回,通知系统把数据放入自己的发送缓冲区。

18,356

社区成员

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

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