Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有必要传达(或预测)Python套接字TCP Buff大小_Python_Sockets_Tcp - Fatal编程技术网

是否有必要传达(或预测)Python套接字TCP Buff大小

是否有必要传达(或预测)Python套接字TCP Buff大小,python,sockets,tcp,Python,Sockets,Tcp,我正在为我工作的办公室开发内部电话系统软件。我们很幸运地使用了Twilio来管理我们的电话树,但我们希望创建一种更好的方法来监控来电,并在来电者与我们的一名员工连接后转发来电 我们处于一个混合(Windows和Mac)环境中,因此我选择使用Python来编写该应用程序的桌面部分。我(大部分)仍处于这个项目的笔墨阶段。我有一些Python/TKinter的经验,还有一些TCP套接字的经验(使用CakePHP,而不是Python),对于如何管理服务器(向Twilio发出命令)和客户端应用程序之间的数

我正在为我工作的办公室开发内部电话系统软件。我们很幸运地使用了Twilio来管理我们的电话树,但我们希望创建一种更好的方法来监控来电,并在来电者与我们的一名员工连接后转发来电

我们处于一个混合(Windows和Mac)环境中,因此我选择使用Python来编写该应用程序的桌面部分。我(大部分)仍处于这个项目的笔墨阶段。我有一些Python/TKinter的经验,还有一些TCP套接字的经验(使用CakePHP,而不是Python),对于如何管理服务器(向Twilio发出命令)和客户端应用程序之间的数据包传输,我有一些问题

客户端应用程序将向用户显示呼叫队列中的呼叫者数量,并允许用户通过其电话接受呼叫,以及将呼叫者发送回队列(或另一个代理)。以下是我考虑过的两种方法:

方法1

客户端(Python)应用程序侦听来自VPS的TCP连接。这将是最少的内存密集型,但读取了buff大小,特别是

关于:“如果您有一个协议,其中传入的数据包长度是完全已知的,那么显然最好只读取“最多”您正在处理的数据包所需的内容,否则您可能会吃掉下一个数据包,这将令人恼火。”

这对于应用程序开发人员来说可能更可取,但对于底层网络堆栈来说可能效率低下。首先,它占用了套接字缓冲区空间,可用于额外的网络I/O。其次,您所做的每一个recv()都意味着进入一个系统调用/内核空间,并且转换会带来性能损失。最好是用尽可能少的系统调用从内核空间获取尽可能多的数据,并在用户空间中进行消息解析。这增加了应用程序代码和消息处理的复杂性,但可能是最有效的

我真的很矛盾-吃下一包是一件事吗?我如何预测buff的大小,或者我需要预测吗

方法2

我可以让应用程序每隔
n
秒查询一次“国情咨文”。但这似乎是浪费


正确答案是什么。有什么我遗漏的吗?

您读过的缓冲区大小帖子谈到了低级别的细节,这些细节只对性能有很小的影响。它不是你通常应该关心的东西,如果你只知道你想要使用的协议是“tcp”,那就更不用说了。首先,您需要设计一个TCP协议。我的意思是,你需要以某种方式格式化你的信息

因此,关于“吃掉下一个数据包”的问题,您忽略了一个事实,即post讨论了一个协议(通过TCP),该协议将数据包长度作为流的一部分,或者每个数据包都有一个固定/可预测的大小。这些“数据包”只是应用程序想要处理的信息单元,而不应将TCP缓冲区大小视为问题的一部分。

“吃下一包”发生在你只是记录了太多,并且你读到的部分属于下一包的情况下——如果你决定忽略额外的部分,那么你就吃了它。不过,没有什么能阻止你把它留到以后。只要始终在代码中的某个点处理每个接收到的字节,缓冲区大小可以是任意大小

关于“方法2”,如果我读对了,那就是轮询,如果你不能做任何其他事情,这才是一个好主意(HTTP服务器的常见情况)


对于这个问题,我的建议是不要重新发明另一种协议来传递消息和使用,例如,这是一个可移植的消息队列库,实际上只是一个使用精心设计的TCP协议的套接字库。

您所阅读的缓冲区大小帖子谈论的是低级细节,而这些细节对性能的影响很小。它不是你通常应该关心的东西,如果你只知道你想要使用的协议是“tcp”,那就更不用说了。首先,您需要设计一个TCP协议。我的意思是,你需要以某种方式格式化你的信息

因此,关于“吃掉下一个数据包”的问题,您忽略了一个事实,即post讨论了一个协议(通过TCP),该协议将数据包长度作为流的一部分,或者每个数据包都有一个固定/可预测的大小。这些“数据包”只是应用程序想要处理的信息单元,而不应将TCP缓冲区大小视为问题的一部分。

“吃下一包”发生在你只是记录了太多,并且你读到的部分属于下一包的情况下——如果你决定忽略额外的部分,那么你就吃了它。不过,没有什么能阻止你把它留到以后。只要始终在代码中的某个点处理每个接收到的字节,缓冲区大小可以是任意大小

关于“方法2”,如果我读对了,那就是轮询,如果你不能做任何其他事情,这才是一个好主意(HTTP服务器的常见情况)


对于这个问题,我的建议是不要重新发明另一个协议来传递消息和使用,例如,这是一个可移植的消息队列库,实际上只是一个使用精心设计的TCP协议的套接字库。

谢谢。我只是在本地机器上发送和接收了两个样本数据包,其中只有几行使用zeromq。这是一个巨大的帮助。文档很好,很容易理解。谢谢。我只是在本地机器上发送和接收了两个样本数据包,其中只有几行使用zeromq。这是一个巨大的帮助。文档很好,很容易理解。