- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我使用 1024 作为我的客户端套接字的缓冲区大小:
recv(1024)
假设服务器要发送给我的消息包含 2024 个字节。我的套接字只能接收 1024 个字节。其他 1000 字节发生了什么?
或
如果 1.) 是正确的...我有没有办法确定接收数据在返回之前应该等待的时间量,还是由系统确定? (即我可以告诉套接字在停止等待更多数据之前等待 5 秒吗?)
更新:假设,我有以下代码:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((sys.argv[1], port))
s.send('Hello, world')
data = s.recv(1024)
print("received: {}".format(data))
s.close()
假设服务器发送大小> 1024 字节的数据。我可以确定变量“数据”将包含所有数据(包括第 1024 个字节以外的数据)吗?如果我不能确定这一点,我将如何更改代码以便我始终可以确保变量“数据”将包含从服务器(通过一个或多个步骤)发送的所有数据?
最佳答案
这取决于协议(protocol)。某些协议(protocol)(如 UDP)发送消息并且每次 recv
仅返回 1 条消息。假设您专门谈论 TCP,则涉及多个因素。 TCP 是面向流的,由于当前未完成的发送/接收数据量、线路上丢失/重新排序的数据包、延迟的数据确认以及 Nagle 算法(将一些小的发送延迟几百毫秒),它的随着客户端和服务器之间对话的进行,行为可能会发生微妙的变化。
接收者只知道它正在获取字节流。它可以在任何 recv 上获取从 1 到完全请求的缓冲区大小的任何内容。一侧的发送调用与另一侧的接收调用之间没有一对一的关联。
如果您需要确定消息边界,则需要更高级别的协议(protocol)来确定。以 HTTP 为例。它以\r\n 分隔的 header 开头,然后计算客户端应该接收的剩余字节数。客户端知道如何读取 header ,因为\r\n 然后确切地知道接下来有多少字节。 RESTful 协议(protocol)的部分魅力在于它们是基于 HTTP 的,而其他人已经解决了这个问题!
一些协议(protocol)使用 NUL 来分隔消息。其他人可能有一个固定长度的二进制头,其中包括对即将到来的任何可变数据的计数。我喜欢zeromq它在 TCP 之上具有强大的消息传递系统。
关于 receive 发生的事情的更多细节...
当你执行recv(1024)
时,有6种可能
没有接收数据。 recv
会等待直到有接收数据。您可以通过设置超时来更改它。
有部分接收数据。你会马上得到那部分。其余部分要么已缓冲,要么尚未发送,您只需执行另一次接收即可获得更多(同样的规则适用)。
有超过 1024 个字节可用。您将获得 1024 个数据,其余数据缓冲在内核中等待下一次接收。
对方关闭了socket。您将获得 0 字节的数据。 0 意味着您永远不会在该套接字上获得更多数据。但是,如果您一直要求数据,您将一直得到 0 字节。
另一方已重置套接字。你会得到一个异常(exception)。
其他一些奇怪的事情发生了,你会得到一个异常(exception)。
关于python - python socket.recv() 方法如何知道已经到达消息结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41382127/
一段时间以来,我一直在做这个反复出现的噩梦(阅读 - 我的应用程序中的错误)。出于某种原因,某个计时器在我停止后继续发送“Elapsed”事件,即使 在事件本身 计时器“承认”已被禁用!检查一下: /
为了找到 2 个 git 分支的共同祖先,需要做的是: git merge-base branch another_branch 好的。但是……如果两个分支都已经 merge 了怎么办?当我在这种情况
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 1年前关闭。 Improve this
我想要一个相机 View ,可以将图像捕获到本地文件或让用户从本地照片库中选择图像。我想也许有人为此编写了很好的库/代码。也许我可以利用它。已经有好的了吗?谢谢。我只是避免重新发明轮子:) 最佳答案
我从 master 分支创建了一个功能分支。之后有来自功能分支的提交 [F1]。 [F1] -- Feature Branch / [M1]-[M2
我喜欢使用 .NET 进行编程,尤其是 C# 3.0、.NET 3.5 和 WPF。但我特别喜欢的是 Mono .NET 确实与平台无关。 现在我听说了 Mono 中的 Olive 项目。我找不到某种
介绍和搜索 所以我认为我犯了一个严重的错误,我很担心。我已经分析了独立负责人的论坛,我已经接近找到答案,但场景太具体,不适用于我所在的位置。如果您找到可以回答我的问题的特定主题,请链接我。 例如:Ho
我有一个类似于下图的提交图。标记为 * 的提交表示大量提交。 A* | B--------- | | C* D* master 和 cor
我喜欢使用 .NET 进行编程,尤其是 C# 3.0、.NET 3.5 和 WPF。但我特别喜欢的是 Mono .NET 确实与平台无关。 现在我听说了 Mono 中的 Olive 项目。我找不到某种
我们最近接手了一个 .NET 项目,在查看 db 后,我们在某些列中有以下内容: 1)某些列具有诸如" & etc etc 2) 有些有 标签和其他非 html 编码的标签 这些数据
你好,当我导航到应用程序中的另一个页面时出现此错误 我不知道为什么这个错误出现 #0 _AsyncCompleter.complete (dart:async/future_impl.da
我使用以下 C 算法计算数据的 CRC32: #define CRC32_POLYNOM_REVERSED 0xEDB88320 uint32 calcCrc32(uint8* buffer, u
我试图在我的一个测试中断言模型中的字段没有改变。我知道从哲学上这是不正确的,但由于我控制了我需要知道的所有变量,所以我只想检查我的数据库条目是否没有改变。 我愿意接受一个解决方案,该解决方案可以将其转
我是 GitHub 的新手。并通过 Eclipse 使用它我们是两个人在开发一个应用程序。当我在 Git shell 中检查 git status 时,我得到以下状态。 On branch maste
简单代码: std::ifstream file("file.txt"); std::string line; while(getline(file,line)) ; //exhaust file
是的,我又找不到这个 Gradle DSL 方法:'compile()' 问题。 我检查了我有: buildscript { repositories { jcenter()
HTML: articles CSS: #main_menu { float: left; padding-top: 10px; vertical-align: m
我是一名优秀的程序员,十分优秀!