首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过以太网在Unix上传输数据的最有效方法是什么?

通过以太网在Unix上传输数据的最有效方法是什么?
EN

Stack Overflow用户
提问于 2018-01-18 10:13:50
回答 1查看 74关注 0票数 0

我正在做一个项目,要求PC与另一个运行Linux的设备传输一个4位数组。这种传输发生在Python中嵌套的for循环中,所以我希望每次传输都有一个低延迟。我在网上找到了很多建议用netcat传输文件的资源。然而,我有点担心每次打开/关闭文件都会带来很长的延迟。

对于像这样简单的数据传输,最有效的数据传输方式是什么?

EN

回答 1

Stack Overflow用户

发布于 2018-01-18 19:23:27

首先,确保您不会在每次要发送数据时都建立新的连接。如果您每次运行循环时都重新连接,这肯定会给您的通信增加很多延迟(无论您使用什么工具)。此外,根据循环的速度和TIME_WAIT的系统设置,您可能会耗尽系统上的端口(这是系统清除未使用的网络连接所需的时间-如果您持续打开太多连接太快,最终会遇到问题,因为您将达到打开连接的最大数量)。

您可以在循环外部创建套接字,并在循环中写入/读取它-因此,连接建立只会延迟一次。

现在,根据你的应用程序的时间重要性,你可能想要为你的通信选择正确的网络协议-4位是非常少的信息量,这些信息量被包裹在半个几十层中,这些层包含网络协议所需的所有类型的信息:源和目标的网络地址,控制校验和,序列号等,所以每个单独的包可能非常大,尽管只包含4位有用的信息。另一方面,如果您运行的不是物联网设备,而是以太网上的计算机,那么您可能不需要关心这一点。

也就是说,如果您想要尽可能有效,您可能会希望以尽可能低的级别发送信息。看看https://docs.python.org/3/howto/sockets.html

快速总结

在服务器端执行以下操作:

代码语言:javascript
复制
# create an INET, STREAMing socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# bind the socket to a public host, and a well-known port
serversocket.bind((socket.gethostname(), port_number))
# become a server socket
serversocket.listen(1)
# accept connection from outside
(clientsocket, address) = serversocket.accept()
# now do something with the clientsocket
# in this case, we'll pretend this is a threaded server
while True:
    # receive at most 1 byte of data
    data = clientsocket.recv(1)
    if (not data):
        break
    do_something_with( data )

在客户端执行以下操作:

代码语言:javascript
复制
# create an INET, STREAMing socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# connect to the server on specific port
s.connect((server_ip_or_hostname, port_number))
data = get_your_for_bits_as_bytestring()
# send the data until there is no more of them or we lose the socket
while (s and data):
    s.sendall(data)
    data = get_your_for_bits_as_bytestring()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48312816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档