【问题标题】:what is the difference between TCP_NODELAY and MSG_DONTWAITTCP_NODELAY 和 MSG_DONTWAIT 有什么区别
【发布时间】:2016-04-13 11:14:43
【问题描述】:

TCP_NODELAYMSG_DONWAIT 之间有什么区别?我知道一个是特定于 TCP 的,另一个是用于发送时的通用套接字选项,但是这两个选项在不同场景下的行为是否不同? 就像TCP_NODELAY 一样,MSG_DONTWAIT 是否也禁用了 Nagle 算法?

具体来说,我正在尝试通过本地 LAN 网络发送数据,并且我不希望我的套接字在发送时因为任何原因而被卡住,我只希望它发送数据包并立即返回。哪一个是更好和更可靠的选择。 (这个问题是针对 Linux 套接字的)

【问题讨论】:

    标签: linux sockets tcp


    【解决方案1】:

    TCP_NODELAY 在这里帮不了你——Nagle 算法只是关于如何在数据流出之前在 TCP 堆栈中缓冲数据,并且不会影响程序中的控制流。您想要的是一个非阻塞套接字 - 发送调用将立即返回,您可以稍后查询它们以了解是否发生了任何事情。

    【讨论】:

    • 或在阻塞模式下使用套接字,但将其移动到自己的工作线程。
    • 这可行,但该线程仍然必须处理套接字卡住的可能性,并且根据您使用的库,您可能会查看一些非常复杂的代码来制作线程正常工作。
    • 即使在阻塞模式下,你仍然可以在读写操作上使用超时来避免死锁。
    • 仅在发送缓冲区已满时才阻止发送。如果发送缓冲区有空间,阻塞和非阻塞都需要相同的时间。
    • 使用超时来避免死锁当然比让您的应用程序永远锁定要好,但这仍然不是最佳选择,因为 (a) 您的应用程序仍然会死锁且无响应,直到下一次超时发生,并且 (b) 定期超时意味着即使没有要处理的网络流量,您的应用程序也会定期唤醒,这是低效的 - 特别是如果您的应用程序在电池容量有限的便携式设备上运行。
    猜你喜欢
    • 2014-04-03
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    相关资源
    最近更新 更多