请问在阻塞模式下使用sendto会不会阻塞,在什么情况下阻塞和如何避免?

chengwei_xj 2003-09-15 11:33:58
还有,如果会阻塞,是不是意味着在阻塞模式下,每一个sendto操作都应该放在一个发送线程中去?
...全文
305 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengwei_xj 2003-12-02
  • 打赏
  • 举报
回复
谢谢大家
chengwei_xj 2003-09-16
  • 打赏
  • 举报
回复
up
chengwei_xj 2003-09-15
  • 打赏
  • 举报
回复
sendto在什么情况下阻塞呢?
ypos 2003-09-15
  • 打赏
  • 举报
回复
sendto就算阻塞也应该不会阻塞很久,因为只是发送出去
gzshd 2003-09-15
  • 打赏
  • 举报
回复
如果在阻塞模式下就可以不在线程里sendto了,阻塞模式下,当程序执行到sendto时,该线程就停住,等sendto函数完成返回后,再向下运行,而非阻塞模式就不等sendto,而接着向下运行
howtotell 2003-09-15
  • 打赏
  • 举报
回复
不会吧。
资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 在网络编程中,阻塞模式和非阻塞模式是两种常见的 I/O 模式,它们对程序的效率和资源利用有着重要影响。本文将详细探讨 Linux 环境下 UDP Socket 的阻塞模式与非阻塞模式的区别,以及它们各自的应用场景。 阻塞模式:在这种模式下,当执行 I/O 操作(如读写)时,如果条件不满足(如无数据可读或缓冲区已满),进程被挂起,直到条件满足。 非阻塞模式:在这种模式下,如果 I/O 操作的条件不满足,则立即返回错误码或特定值,而不是挂起进程。 读操作:recvfrom() 函数在没有数据可读时阻塞,直到接收到完整的数据报。 写操作:sendto() 函数通常因发送缓冲区满而阻塞,因为 UDP 不维护发送缓冲区。 示例代码: 读操作:如果接收缓冲区为空,recvfrom() 立即返回错误(通常是 EWOULDBLOCK)。 写操作:与阻塞模式类似,sendto() 通常因发送缓冲区满而阻塞。 示例代码: MSG_DONTWAIT 标志表示即使无数据可读也阻塞阻塞模式:TCP 的读操作阻塞直到有足够数据可读;写操作如果发送缓冲区满也阻塞。 非阻塞模式:读操作无数据可读时立即返回错误;写操作如果发送缓冲区满则返回错误。 阻塞模式:适用于需要等待特定事件(如客户端连接或数据)的场景,适合处理单个连接,但可能浪费资源。 非阻塞模式:适用于高并发场景,如 Web 服务器,通过轮询多个连接状态,可高效利用 CPU 资源,提升性能。 通过对比 Linux UDP Socket 的阻塞模式与非阻塞模式,可以看出它们在行为和适用场景上的差异。合理选择模式可以显著提升程序效率和响应能力。希望本文能帮助读者更好地理解和运用这两种模式

18,357

社区成员

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

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