【问题标题】:What will be the socket behavior if program is stopped at break point?如果程序在断点处停止,套接字的行为会怎样?
【发布时间】:2014-07-28 19:50:56
【问题描述】:

这是场景:

我在 Linux 中有一个基于选择的套接字服务器,它一次处理单个数据包。假设有几个数据包正在高速传输,当我的进程处于当前数据包的处理阶段时,我遇到了一个断点。我的问题是,当它在断点处停止时,发送到我的服务器进程的数据包会发生什么。他们会被淘汰吗?或者操作系统是否会缓冲这些数据包并在断点结束时将其传递给我的进程?

虽然我有一些想法,但我想在这里从大师那里确认一下,可能我会了解更多关于套接字行为的信息。

任何帮助将不胜感激。

【问题讨论】:

  • 你可以很容易地尝试这个......为什么在这里提问并等待数小时(或数天)才能在几分钟内回答你自己的问题?
  • 我会在几分钟内得到答案。那是关于stackoverflow的一个美妙的事情。正如我所说的那样,我可能会在这里讨论时学习新事物或幕后发生的事情。知识从来都不是完整的东西。
  • 无论如何,研究自己问题的能力是开发人员最重要的工具之一。试试这个实验,然后问一些你不明白的问题。从长远来看,你会从中得到更多。
  • 我想知道程序在断点处停止,程序非常慢,或忙于其他事情,或被换出并拒绝 CPU 时间,或任何其他原因之间有什么区别在套接字读取之间花费很长时间。

标签: c linux sockets network-programming posix


【解决方案1】:

传入的数据包将由操作系统内核排队,直到其缓冲区已满。任何更多的数据包都将被丢弃,但取决于连接的类型,内核可能会向另一端发出停止发送的信号(TCP aka SOCK_STREAM 应该,UDP aka SOCK_DGRAM 可能不会)。 发件人应该准备好处理这种情况。

缓冲区有多大取决于系统;您可能能够查询大小和/或更改它(如何完成通常取决于操作系统)。

您的进程是否因调试而暂停并不重要,只是缓慢、忙于等待其他事件或正在换入;如果它没有从套接字读取数据,它将被排队。

【讨论】:

  • TCP 通知另一端停止发送,并且对等应用程序根本不需要对此做任何事情,除非它错误地使用了非阻塞模式。查询和更改套接字接收缓冲区大小不依赖于操作系统:它在所有平台上通过 get/setsockopt() 和 SO_RCVBUFSIZ 完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 2019-04-29
  • 2012-07-15
  • 2011-05-22
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多