send和recv函数的问题

品茶识书香 2010-05-20 10:04:35
我在网上看到
这是发送、接收函数的原型
int send( SOCKET s, const char FAR *buf, int len, int flags );
int recv( SOCKET s, char FAR *buf, int len, int flags );

看到网上说
send仅仅是把buf中的数据copy到s的发送缓冲区的剩余空间里
recv函数仅仅是copy数据,真正的接收数据是协议来完成的
这两句话我明白,就是SOCKET对象底层维护着一个接收和发送的缓存。在发送和接收的时候,都是对这个缓存操作的。

现在我的问题是。如果服务器A 的 recv正在等待对方的数据堵塞在那里。对方客户A 的send已经把他要发送的数据copy到了他的缓冲区里,这时,突然对方关掉了SOCKET那么复制进客户A的发送缓存中的数据是否还会发送到我这边?我这边是接收到完整的数据。还是返回服务器A 的recv函数返回SOCKET_ERROR?

请高手指点
...全文
132 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
品茶识书香 2010-05-21
  • 打赏
  • 举报
回复
同步异步应该没啥区别吧。现在就算是异步的话。写进缓存。那SOCKET突然断掉。有没有可能收不到情况?
kang3252 2010-05-21
  • 打赏
  • 举报
回复
关注。。。。。。。。。
品茶识书香 2010-05-21
  • 打赏
  • 举报
回复
比如说对方直接send()非阻塞的。。然后突然closesocket()..我这边是不是就有可能收不到他的数据了?
品茶识书香 2010-05-21
  • 打赏
  • 举报
回复
也就是说 ,如果对方要是关闭的话,我会先收到对方的关闭消息的通知包。在缓存中的数据就算发过来。到时也是收不到了?
天山游龙 2010-05-21
  • 打赏
  • 举报
回复
已经在发送路上的会发送完毕,还在缓冲区没有发送出去的数据不会发送,因为这时socket会收到对方关闭的通知包,socket的send就会返回0了!
如果对方是非法关闭,比如是断电等,则这边的socket收不到对方的关闭通知包,则这边的socket的send的会一直会阻塞在哪里,直到超时,否则会永远的阻塞住了、
twenson_sd 2010-05-21
  • 打赏
  • 举报
回复
非正常断电等,肯定会返回超时信号的
dlut_smellycat 2010-05-21
  • 打赏
  • 举报
回复
socket一断,服务器端recv()就返回-1了,再发什么应该都收不到了吧。。。
yaozhiyong110 2010-05-20
  • 打赏
  • 举报
回复
异步的话当然会发出去 只是没被接收 同步的话没被接收 会等待 直到超时 最后返回error
品茶识书香 2010-05-20
  • 打赏
  • 举报
回复
那么一本呢。我现在一点一点看呢。不过想了解下。因为可能最近要用到,麻烦简单介绍下。。谢谢。。
向立天 2010-05-20
  • 打赏
  • 举报
回复
你看看TCP/IP协议就好了
socket就是对它的实现
buptzwp 2010-05-20
  • 打赏
  • 举报
回复
等A的发送缓冲区满了,就会SOCKET_ERROR。
品茶识书香 2010-05-20
  • 打赏
  • 举报
回复
高手帮忙呀

18,363

社区成员

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

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